Java 反射深入浅出
Java 反射深入浅出📈
反射的概述:📑
Java Reflection(反射) 被视为动态语言
的关键,Java并不是动态语言,但因为反射Java可以被称为准动态语言
反射机制允许程序在执行期 借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内 部属性及方法。反射是框架的灵魂
- 我们都知道Java 程序在加载完之后,在堆内存的方法区中就产生了一个Class类型的对象
一个类只有一个Class对象
,这个对象包含了整个类的结构信息,可以通过这个对象看到类的结构。 - 这个对象就像
照镜子
一样,反射
出类的信息。
动态语言
是一类在运行时可以改变其结构的语言:
例如新的函数、对象、甚至代码可以 被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运 行时代码可以根据某些条件改变自身结构。
主要动态语言: Object-C、C#、JavaScript、PHP、Python、Erlang
静态语言
与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、 C++。
反射的入门案例:
上面说了这么多其实还是有点模模糊糊,归根结底,反射也就是Java中的一组API,常用的类有:
- Java.lang.Class:代表一个类的字节码文件。注意并不是小写的
class 关键字
而是一个类,可以理解为是类的类。 - Java.lang.reflect.Field:代表类的成员变量
- Java.lang.reflect.Method:代表类中的方法
- Java.lang.reflect.Constructor:代表类的构造器
环境搭建:
定义 Person
类
//创建一个人的类
public class Person {//姓名public String name;//年龄: 因为有点人的年龄是保密的,private int age;//无参公共构造函数public Person(){ }//有参私有构造函数private Person(String name, int age) { this.name = name; this.age = age; }//定义方法//说话表达,人都可以说话表达这个是公开说出来的public void speak(){ System.out.println(name+"表达说出自己的话"); }//心想思考,这个过程是内心活动是私有的private void think(){ System.out.println(name+"在内心在思考,晚上吃什么^^"); }//省略封装的toString/get/set方法...
}
Deom实例:
创建Person的类对象,并调用属性方法,正常的Java操作:
Java创建对象:
//Java创建对象并使用:
@Test
public void common(){//创建对象Person person = new Person();//属性赋值并输出...person.setName("张三");person.speak();System.out.println("我叫:"+person.name+"今年:"+person.getAge()); //私有的属性被封装仅可通过公共get/set方法操作.//正常情况Java在类的外部不可以调用私有属性、方法、构造
}
Java反射创建对象:
//通过反射机制创建对象并使用:
@Test
public void reflection() throws Exception{//1.反射创建对象//通过Person类.class 获取一个Class对象,并通过getConstructor()获取其Public构造对象创建对象.Class<Person> personClass = Person.class;Constructor<Person> constructor = personClass.getConstructor(); //方法需要捕获/抛出异常:NoSuchMethodExceptionPerson person = constructor.newInstance(); //这里的参数需要和上面getConstructor() 定义时一只不然会抛出IllegalAccessException类型转换异常.person.setName("张三");System.out.println("我叫:"+person.name+"今年:"+person.getAge()); //反射创建的对象并调用属性方法,因为Java的封装性任然不能调用私有的方法;//2.通过反射调用类的Public属性,并更改对象的name属性Field nameField = personClass.getDeclaredField("name");nameField.set(person,"李四");System.out.println("我叫:"+person.name);//3.通过反射调用类的Public方法Method speak = personClass.getDeclaredMethod("speak");speak.invoke(person);//-------------目前使用反射做到和反射钱一样的操作,但是反射更加强大它可以调用类的Private私有构造/方法/属性System.out.println("使用反射调用私有构造/属性/方法");//1.通过反射可以调用私有构造器Constructor<Person> declaredConstructor = personClass.getDeclaredConstructor(String.class, int.class);declaredConstructor.setAccessible(true);Person person1 = declaredConstructor.newInstance("王五", 10);System.out.println("我叫:"+person1.name+"今年:"+person1.getAge()); //通过反射调用私有的构造完成了对象实例化操作.//2.通过反射调用私有的属性Field ageField = personClass.getDeclaredField("age");ageField.setAccessible(true);ageField.set(person1,20);System.out.println("我叫:"+person1.name+"今年:"+person1.getAge()); //通过反射调用私有的属性并重新赋值.//3.通过反射调用私有的方法Method thinkMethod = personClass.getDeclaredMethod("think"); //通过反射调用私有的方法thinkMethod.setAccessible(true);thinkMethod.invoke(person1); //invoke(需要被调用方法类的对象);
}
好的,通过上面的基础方法,大概了解了反射的基本使用: 反射机制允许程序在执行期 借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内 部属性及方法。
反射核心 Class类
Java.lang.Class类:
Class类是一个特殊类本质也是一个类
,它用于表示JVM运行时类或接口的信息
Class 对象只能由系统建立对象,一个加载的类在 JVM 中只会有一个Class实例,Class对象对应的是一个加载到JVM中的一个.class文件
每个类的实例都会记得自己是由哪个 Class 实例所生成,通过Class可以完整地得到一个类中的所有被加载的结构,Class类是Reflection的根源,针对任何你想动态加载、运行的类,唯有先获得相应的 Class对象。
Java类加载简单过程:
这里只是简单了解一个大概的过程,其内部的原理更加复杂…
创建Class类的对象四种方法
:
-
调用运行时类的 .class属性
-
通过运行时类的对象,调用.getClass()方法;
-
使用类加载器,ClassLoader进行创建Class对象
-
通过Class类的静态方法 forName(“全类名”); 的形式进行调用。
✨最常用
-
通过Class类的静态方法 forName(“全类名”); 的形式进行调用。
✨最常用
//Class 对象创建的几种方式:使用Person类举例
public class CreateClass {public static void main(String[] args) throws ClassNotFoundException {//方式一:调用运行时类的 .class属性.Class<Person> class1 = Person.class;//方式二;通过运行时类的对象,调用.getClass()方法;Person person = new Person();Class<? extends Person> class2 = person.getClass(); //此种方法并不常用因为已经获取到了类的对象就可以完成大部分的操作了没必要多此一举了.//方式三: 通过Class类的静态方法 forName(“全类名”); 的形式进行调用//方法需要声明异常 ClassNotFoundException,也是最常用的方法,因为很多时候,我们都是不能确定要创建什么类的时候而这种方法可以通过传参自定义创建的对象,使程序具有动态性。Class class3 = Class.forName("com.wsm.begin.Person");//方式四:使用类加载器,ClassLoader进行创建Class对象//这种方法有点了离谱先通过Class对象获取 ClassLoader类加载器在去获取其他 Class对象;ClassLoader classLoader = CreateClass.class.getClassLoader();Class<?> class4 = classLoader.loadClass("com.wsm.begin.Person");//上面说每个类在加载到JVM中时候只有一个对应的Class,所以这四种创建Person Class对象,的对象值其实都是用的同一块内存空间地址.System.out.println(class1==class2 && class3==class4); //结果是:True}
}
哪些类型可以有Class对象?
Java中,基本上任何对象属性都存在 Class对象,基于面向对象的原则万事万物皆是对象。
外部类、内部类、静态内部类、interface接口、数组、enum枚举、@annotation注解、基本数据类型、void…都存在Class对象。
//Java中那些类型存在Class的对象.
//Java中万事万物皆对象,只要可以是对象就都有Class对象.
@Test
public void allClass(){Class c1 = Object.class; //Object类中存在 .getClass(); 所以所有的方法都可以通过改方法获取对象.Class c2 = Comparable.class; //接口Class c3 = String[].class; //数组Class c4 = int[][].class; //多维数组Class c5 = ElementType.class; //枚举Class c6 = Override.class; //注解Class c7 = int.class; //基本数据类型Class c8 = void.class; //voidClass c9 = Class.class; //Class类本身也是底层一个Class文件.//注意:只要元素类型与维度一样,就是同一个Class 因为本质上在JVM都是同一个CLass文件所以结果: Trueint[] a = new int[10];int[] b = new int[100];Class c10 = a.getClass();Class c11 = b.getClass();System.out.println(c10 == c11);
}
Class类的常用方法:
方法名 | 功能说明 |
---|---|
static Class forName(String name) | 返回指定类名 name 的 Class 对象 |
Object newInstance() | 调用空参构造函数,返回该Class对象的一个实例 |
getName() | 返回此Class对象所表示的实体(类、接口、数组类、基本类型 或void)名称 |
Class getSuperClass() | 返回当前Class对象的父类的Class对象 |
Class [] getInterfaces() | 获取当前Class对象的接口 |
ClassLoader getClassLoader() | 返回该类的类加载器 |
Class getSuperclass() | 返回表示此Class所表示的实体的超类的Class |
Constructor[] getConstructors() | 返回一个包含某些Constructor对象的数组 |
Field[] getDeclaredFields() | 返回Field对象的一个数组 |
Method getMethod(String name,Class … paramTypes) | 返回一个Method对象,此对象的形参类型为paramType |
获取运行时类的运行状态:
环境准备
定义一个子类,继承父类,实现接口,私有|共有的构造函数,私有|共有属性、方法、注解…
自定义一个注解类:MyAnnotation
//自定义注解类
@Retention(RetentionPolicy.RUNTIME) //一种元注解: 标识注解的执行生命周期,只有是运行时的注解才可以被反射使用.
public @interface MyAnnotation {//这是自定义注解中,属性的声明方式: 数据类型 参数名;String value() default "wsm"; /** 如果只有一个参数成员,建议使用参数名为value */
}
生物类Creature
public class Creature<T> implements Serializable { //实现序列化的接口//共有属性: 性别public String sex;//私有属性:年龄private int age;//公共|私有方法public void eat(){ System.out.println("吃饭了..."); }private void slepp(){ System.out.println("吃饱了,睡觉..."); }//Java默认类具有一个无参的构造...//省略封装的toString/get/set方法...
}
人类Person
public class Person extends Creature<String> implements Comparable{ //注意这里的父类带泛型<String>//共有属性:姓名public String name;//私有属性:学历private String education;//公共|私有构造public Person (){ System.out.println("无参构造执行..."); }private Person(String name, String education) { this.name = name; this.education = education; }//公共|私有方法//说话表达,人都可以说话表达这个是公开说出来的public void speak(){ System.out.println(name+"表达说出自己的话"); }//心想思考,这个过程是内心活动是私有的,方法具有:注解 访问修饰符 返回值 声明的异常...都可以通过反射获取.@MyAnnotationprivate String think() throws RuntimeException,IllegalAccessError { return "在内心在思考,晚上吃什么^^"; }//重写Comparable Java比较器的方法.@Overridepublic int compareTo(Object o) { return 0; }//省略封装的toString/get/set方法...
}
反射操作运行时类:
Class对象的newInstance()方法👍
使用反射最常用创建对象的方法 newInstance();
,该方法本质是调用,类的无参构造进行创建对象。所以需要一些硬性要求:
- 类必须有一个无参数的构造器。
- 类的构造器的访问权限需要足够。
//反射操作运行时类对象Test1
@Test
public void fsTest1() throws Exception{//使用Class类的静态方法forName(”全类名“); 获取对应的Class对象Class<Person> classP = (Class<Person>) Class.forName("com.wsm.reflection.study.Person"); //方法需要抛出异常因为可能存在全类名不存在的类.Person person = classP.newInstance(); //方法需要抛出异常因为可能存在类的构造函数不存在的情况.
}
获取运行时类的结构:
获取运行时类的结构:父类,实现的接口,获取类的全类名,接口调用构造完成实例化
getSuperclass();
获取父类的Class对象getInterfaces();
获取类实现的所有接口,反击一个Class[]getTypeName();
获取Class的全类名getConstructor(...);|getDeclaredConstructor(...);
(…)表示一个动态长度的参数数组,- 分别表示获取当前Class的仅Public的构造函数。并调用
newInstance(...);
进行初始化操作。 getModifiers();
返回的值是int类型:什么都不加是0 , public 是1 ,private 是 2 ,protected 是 4,static 是 8 ,final 是 16、getParameterTypes();
返回参数列表的数组getName();
获取方法的名称;
- 分别表示获取当前Class的仅Public的构造函数。并调用
getGenericSuperclass();
获取带泛型
的父类,如果父类没有泛型则获取不到Type
类型- ParameterizedType 泛型类型的对象,
getActualTypeArguments();
获取泛型对象的数组。
- ParameterizedType 泛型类型的对象,
setAccessible(boolean);
Method和Field、Constructor对象都有setAccessible()方法;- setAccessible启动和禁用访问安全检查的开关,参数值为true则指示反射的对象在使用时应该取消Java语言访问检查即可以使用Private的属性方法构造
//获取运行时类的结构:父类,实现的接口,获取类的全类名,接口调用构造完成实例化.
@Test
public void runClassStructure() throws Exception {Class<Person> classP = (Class<Person>) Class.forName("com.wsm.reflection.study.Person");//获取其父类Class对象Class<? super Person> superclass = classP.getSuperclass();//获取接口Class<?>[] classPInterfaces = classP.getInterfaces(); //返回一个数组因为一个类可以实现多个接口;//获取子类|父类|接口类的全类名:System.out.println("子类全类名:"+classP.getTypeName());System.out.println("父类全类名:"+superclass.getTypeName());System.out.println("接口类全类名:"+classPInterfaces[0].getTypeName()); //因为子类仅有一个接口就直接[0],当然可以考虑不存在的情况...//获取带泛型的父类的泛型://getGenericSuperclass(); 如果父类没有泛型则不会获取;Type genericSuperclass = classP.getGenericSuperclass();ParameterizedType paramtype = (ParameterizedType) genericSuperclass;System.out.println("获取带泛型的父类:"+genericSuperclass);System.out.println("获取带泛型的父类的泛型的类型:"+paramtype.getActualTypeArguments()[0]); //返回一个数组,因为类的泛型可以是多个比如:MAP<k,v>//获取子类的Public构造方法创建对象//正常情况下构建对象直接使用 newInstance(); 即可, getConstructor():获取该类的Public的构造方法,并根据参数进行实例化;Constructor<Person> constructor = classP.getConstructor();Person person = constructor.newInstance(); //这里的newInstance方法的参数要和 classP.getConstructor() 一致不然会报错;System.out.println(person);//获取子类的Public和Private构造方法创建对象Constructor<Person> constructor1 = classP.getDeclaredConstructor(String.class, String.class);constructor1.setAccessible(true); //如果调用private的方法|构造需要将启动和禁用访问安全检查的开关设为 TruePerson person1 = constructor1.newInstance("wsm", "大专");System.out.println(person1);//获取构造函数的修饰符 方法名称 参数列表(因为这里知道有两个参数就写死了,方法返回的是一个数组)System.out.println("Person的有参构造的访问修饰符:"+constructor1.getModifiers()+",方法名称:"+constructor1.getName()+",参数类型列表:"+constructor1.getParameterTypes()[0]+","+constructor1.getParameterTypes()[1]);
}
获取运行时类的方法Method:
-
getMethods();
获取子类和父类Public的方法。 -
getDeclaredMethods
获取子类Public和Private的方法。 -
getMethod();|getDeclaredMethod();
根据方法名指定获取仅共有包含父类|仅当前类但包含共有私有的方法。-
setAccessible(boolean)
获取私有的方法需要,设置true开通访问权限。 -
Object invoke(Object obj,Object... args);
相当于代替obj对象调用指定的方法的方法,返回值Object类型,若原方法无返回值,此时返回null若原方法若为
static
静态方法,此时形参Object obj可为null若原方法形参列表为空,则Object[] args为null,可以不填
若原方法声明为private,则需要在调用此invoke()方法前,显式调用 方法对象的setAccessible(true)方法,将可访问private的方法
-
获取方法的具体信息:
getModifiers();
获取方法权限修饰符getReturnType();
获取方法的返回值getParameterTypes();
获取方法的参数列表,返回一个数组;getExceptionTypes();
获取方法抛出的异常,返回一个异常数组;
//获取运行时类的结构方法:
@Test
public void runClassStructureMethod() throws Exception {Class<Person> classP = (Class<Person>) Class.forName("com.wsm.reflection.study.Person");System.out.println("获取子类父类的所有Public方法,包含Object类");Method[] methods = classP.getMethods();for (Method method : methods) { System.out.println(method); }System.out.println("获取当前Class Public和Private方法,这个不会包含父类"); //如果想要父类的私有方法可以通过 getSuperclass() 先获取父类ClassMethod[] declaredMethods = classP.getDeclaredMethods();for (Method method : declaredMethods) { System.out.println(method); }//上面获取方法都是返回一个数组,反射中也存在单独获取某一个类的操作:getMethod("指定方法名");|getDeclaredMethod("指定方法名"); 和上面大概相同Public和Private的区别;Person person = classP.newInstance();Method thinkMethod = classP.getDeclaredMethod("think");thinkMethod.setAccessible(true);System.out.println("调用方法 invoke(执行方法的对象,...方法的多参属性...) 如果方法存在返回值则也通过 invoke()方法返回;");Object invoke = thinkMethod.invoke(person);System.out.println("Person的think方法返回值:"+invoke);//获取方法的具体信息:System.out.println("取得权限修饰符: "+thinkMethod.getModifiers());System.out.println("取得方法的返回值: "+thinkMethod.getReturnType());System.out.println("取得全部的参数: "+thinkMethod.getParameterTypes()+"返回一个参数数组地址值");System.out.println("取得方法抛出的异常信息: "+thinkMethod.getExceptionTypes()[0]+","+thinkMethod.getExceptionTypes()[1]+"返回一个参数数组地址值");//扩展:获取注解//getAnnotations(); 获取改方法的所有RUNTIME注解数组[],包含父类的注解,因为这个是方法所以不方便展示;//getDeclaredAnnotations(); 仅获取子类的注解;Annotation[] annotations = thinkMethod.getAnnotations();System.out.println(annotations[0]);
}
获取运行时类的属性Field:
这里的方法和类和上面也都类似就不详细介绍了: Field类的常用方法;
Object get(Object obj);
取得指定对象obj上此Field的属性内容set(Object obj,Object value);
设置指定对象obj上此Field的属性内容 obj指要修改的对象 vlaue指要修改的值;
//获取运行时类的结构属性:
@Test
public void runClassStructureField() throws Exception {Class<Person> classP = (Class<Person>) Class.forName("com.wsm.reflection.study.Person");System.out.println("获取子类父类的所有Public属性,包含Object类");Field[] fields = classP.getFields();for (Field field : fields) { System.out.println(field); }System.out.println("获取当前Class Public和Private属性,这个不会包含父类"); //如果想要父类的私有属性可以通过 getSuperclass() 先获取父类ClassField[] declaredField = classP.getDeclaredFields();for (Field field : declaredField) { System.out.println(field); }//上面获取方法都是返回一个数组,反射中也存在单独获取某一个类的操作:getFields("指定属性名");|getDeclaredFields("指定属性名"); 和上面大概相同Public和Private的区别;Person person = classP.newInstance();Field field = classP.getDeclaredField("education");field.setAccessible(true);//设置person的属性field.set(person,"本科");System.out.println("person的学历是:"+field.get(person));
}
相关文章:
Java 反射深入浅出
Java 反射深入浅出📈 反射的概述:📑 Java Reflection(反射) 被视为动态语言的关键,Java并不是动态语言,但因为反射Java可以被称为准动态语言 反射机制允许程序在执行期 借助于Reflection API取得任何类的内部信息&a…...
Windows系统,安装RabbitMQ
官网地址:https://rabbitmq.com 版本:RabbitMQ 3.10.7 (1)查看支持的Erlang版本:https://rabbitmq.com/which-erlang.html (2)下载支持的的erlang版本:https://github.com/erlang/…...
代码随想录第十二天(232)
文章目录232. 用栈实现队列补充知识——Deque232. 用栈实现队列 答案思路: 在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来࿰…...
自动生成代码工具配置文件及技术点详解
引言 之前发过一篇文章关于自动生成代码的项目。有小伙伴私信说要讲一下具体的思路与配置信息,现在满足一下大家的好奇! 配置信息 generator.properties配置文件中的具体内容可以看下方的配置信息说明、对应关系 key值对应含义mainPath主目录package…...
【C++】类与对象(三)
前言 本章我们接替前一章继续深入理解类的默认成员函数,赋值重载,取地址重载,及const取地址操作符重载 但是在讲剩下的三个默认成员函数之前,我们要先来了解运算符重载,因为赋值重载,取地址重载,…...
华为OD机试 - 任务混部 (Python)| 真题+思路+考点+代码+岗位
任务混部 题目 新型冠状病毒疫情的肆虐,使得家在武汉的大壮不得不思考自己家和附近定点医院的具体情况。 经过一番调查, 大壮明白了距离自己家最近的定点医院有两家。其中医院 A 距离自己的距离是 X 公里,医院 B 距离自己的距离是 Y 公里。 由于武汉封城,公交停运,私家…...
Gin 如何编写一个接收文件的 HTTP 接口
文章目录1.前言2.ChatGPT 的回答3.小结参考文献1.前言 以前遇到编程类的问题,第一时间想到的是 Google,而现在我会问 ChatGPT。 2.ChatGPT 的回答 比如 Gin 如何编写一个接收文件的 HTTP 接口,感受下 ChatGPT 工整有序的回答吧。 使用 Gin…...
连续子数组的最大和 (贪心,动态规划) AcWing(JAVA)
输入一个 非空 整型数组,数组里的数可能为正,也可能为负。 数组中一个或连续的多个整数组成一个子数组。 求所有子数组的和的最大值。 要求时间复杂度为 O(n)。 数据范围: 数组长度 [1,1000]。 数组内元素取值范围 [−200,200][−200,200]。 …...
华为OD机试 - 括号检查(Python)| 真题+思路+考点+代码+岗位
括号检查 题目 现有一字符串 仅由(,),{,},[,]六种括号组成 若字符串满足以下条件之一,则为无效字符串 任意类型的左右括号数量不相等存在未按正确顺序(先左后右)闭合的括号, 输出括号的最大嵌套深度 若字符串无效则输出0 0 <= 字符串长度 <= 100000输入 一个只包括(…...
Redis 数据类型
我们知道 Redis 是 Key-Value 类型缓存型数据库,Redis 为了存储不同类型的数据,提供了五种常用数据类型,如下所示: string(字符串)hash(哈希散列)list(列表)…...
【SPSS】频数分析和基本描述统计量详细操作教程(附实战案例)
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
TCP/IP网络编程——多种 I/O 函数
完整版文章请参考: TCP/IP网络编程完整版文章 文章目录第 13 章 多种 I/O 函数13.1 send & recv 函数13.1.1 Linux 中的 send & recv13.1.2 MSG_OOB:发送紧急消息13.1.3 紧急模式工作原理13.1.4 检查输入缓冲13.2 readv & writev 函数13.2.1…...
静态代理和动态代理的区别以及实现过程
前言 代理模式是一种设计模式,能够使得在不修改源目标的前提下,额外扩展源目标的功能。即通过访问源目标的代理类,再由代理类去访问源目标。这样一来,要扩展功能,就无需修改源目标的代码了。只需要在代理类上增加就可…...
Consul SpringCloudK8S
背景说起微服务,就需要用到SpringCloud,目前市面上主流的SpringCloud产品有这些:SpringCloudNeflix、Spring Cloud Alibaba、Spring Cloud for AWS、Spring Cloud Azure 和 Spring Cloud Kubernetes。其中SpringCloudNeflix已经不在更新&…...
anaconda3文件夹被移动之后,如何操作可以复用原有conda环境
anaconda3文件夹被移动A-调整conda PATH地址B-更改.conda/environments.txt中的地址C-修改conda内的变量和每个环境的pip目录A-调整conda PATH地址 B-更改.conda/environments.txt中的地址 a. 优先切换到用户根目录 b. 查看隐藏conda目录 c. 编辑 vi .conda/environments.txt…...
【Java】Stack(栈) Queue(单向队列) Deque(双向队列)
Stack (栈) Stack 是一个先进后出的栈,可以将其理解为一个只开了一个口子的管子,放进去的东西只能从这一个口进出。所以先放进去的元素在取出的时候只能到最后才能取出来。 Stack具备一下几个方法: boolean empty() …...
自定义spring拦截器
说明: 一些版本比较老的spring框架的,是通过继承HandlerInterceptorAdapter并重写preHandle()方法,和继承WebMvcConfigurerAdapter并重写 addInterceptors()方法来实现拦截器的,但是这两个类很久前就已经过时了,不推荐…...
今天正式上线!虹科汽车免拆诊断云展厅:感受精准修车魅力,畅享汽修领先技术
『虹科汽车免拆诊断云展厅』 2月15日正式上线! 在这里,您可以参观了解: 虹科Pico汽车示波器产品模型 全流程专业讲解的视频资料 产品功能和应用场景 全面详细的产品手册 还有虹科首席技术工程师在线连麦答疑!!…...
4.数据类型-字符串【Python】
文章目录字符串索引切片转义字符格式化符号f-string字符串操作判断&检测转换剪切&填充拼接统计格式转化练习字符串 字符串是 Python 中最常用的数据类型。可以使用单引号,双引号,3对双引号创建一个字符串。Python 中没有单独的字符类型 char…...
搞量化先搞数(上):A股股票列表免费抓取实战
到了这一步,我们学习了基础的爬虫请求库urllib和requests,尤其是后者,强大且易用,极其适合新手使用。那么今天我们就找一个相对简单的案例,来看一下如何在实战中应用爬虫技能。 相信很多朋友都对股票感兴趣,甚至有些朋友想要通过量化研究来获得超额收益。然而,想要进行…...
SpringCloud-负载均衡Ribbon
一、配置使用1、添加依赖(该依赖包含在eureka-client依赖中)<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency>2、在RestTemp…...
Linux入门篇(二)
Linux前言链接文件符号链接(软链接)硬链接shellshell 的类型shell的父子关系理解外部命令和内建命令外部命令内建命令Linux环境变量PATH环境变量前言 在这一章,我对Linux中有关shell较为深入的理解和环境变量方面知识的一个记录。同时&#x…...
第四部分:特殊用途的句子——第三章:虚拟
虚拟语气 1、什么是虚拟? 虚拟就是非真实。换句话说,这事不是真的,这事不太可能成真,非真实,就是虚拟 2、怎么表示虚拟? 英语是一个典型的形式来补充内容的语言,若要表达虚拟,只…...
Java中如何获取泛型类型信息
文章目录声明侧泛型使用侧泛型获取泛型类型相关方法1. Class类的泛型方法2. Field类的泛型方法3. Method类的泛型方法4. ParameterizedType类获取声明侧的泛型类型信息获取使用侧的泛型类型信息匿名内部类实现获取使用侧的泛型类型根据使用泛型位置的不同可以分为:声…...
【云原生】centos7搭建安装k8s集群 v1.25版本详细教程实战
文章目录前言一. 实验环境二. k8s 的介绍三 . k8s的安装3.1 搭建实验环境3.1.1 硬件层面的要求3.1.2 软件层面环境配置3.2 docker的安装3.2.1 搭建docker3.2.2 部署 cri-dockerd3.3 部署k8s3.3.1 配置添加阿里云的yum源3.3.2 安装kubeadm kubelet kubectl3.3.3 k8s-master节点初…...
c语言指针
指针 指针是存放地址的变量,也可以说指针地址。 对于定义p(这里的话,只是定义,说明p是指针),p作为一个指针去指向存放数据的位置,而p意思是取(p指向的内存位置的数据)&…...
5.33 综合案例2.0 -ESP32拍照上传阿里云OSS
综合案例2.0 - ESP32拍照上传阿里云OSS案例说明连线功能实现1.阿里云平台连接2.OSS对象存储服务3.ESP32-CAM开发环境4.代码ESP32-CAM开发板代码HaaS506开发板代码测试数据转图片方法案例说明 使用ESP32拍照,将照片数据上传阿里云OSS(通过4G网络上传)。 …...
java无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “…...
测试用例设计工作中的应用
1. 等价类划分 常见的软件测试面试题划分等价类: 等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试.因此,可以把全部输入数据合理划分为假设干等价类,在每一个等价类中取一…...
leetcode 困难 —— 数字 1 的个数(简单逻辑题)
(害,做题是真的慢,这面试给我这题我估计就傻了) 题目: 给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。 题解: 首先看看整数范围 0 < n < 10^9 不能遍历࿰…...
江苏最新疫情防控通告/厦门零基础学seo
React Native SDK诸葛io移动统计支持React Native插件,以下为集成方法。1. 环境准备1.1. iOS环境iOS 8.0代码支持iOS8.0的系统pod 1.0iOS系统的集成依赖于cocoaPod工具1.2. Android环境Android SDK 16代码支持Android 161.3. React Native环境react-native 0.50reac…...
网站制作的流程包括哪些/互联网营销推广渠道
开发环境(蓝色粗体字为特别注意内容) 1、软件环境: Win7 Ultimate sp1、jdk7u45 2、参考文献:https://www.cnblogs.com/jack1208-rose0203/p/5713210.html private static final byte[] ARRAY_CIRCLE { 0x3c, 0x7e, 0xff, 0xff, 0xff, 0xff…...
html企业网站怎么做/网络推广都需要做什么
创建工程 修改字符串资源 打开/res/values/strings.xml文件。 点击Add按钮,添加字符串,输入字符串的name 和value 新建的工程含有三个已有字符串 新建颜色资源color.xml 使用资源颜色和字符串资源 颜色:R.color.red_gb 字符串:R.s…...
云南网站建设优选平台/长沙seo关键词
1 .责任分配矩阵展示项目资源在各个()中的任务分配? A.工作包 B.项目活动 4 .在虚拟团队环境中,()规划变得日益重要? A.资源 B.沟通 参考答案 A B...
池州市网站建设优化/百度推广首次开户需要多少钱
谁发明了计算机?大多数人会说是美国人Mocheri和Ecatki. 他们两个人于1946年发明了名为“ ENIAC”的计算机.实际上,这是一种误解. 该计算机的真正发明者应该是德国人Conrad Zuse. 2010年6月22日是楚泽诞辰100周年.今天,在他出生的柏林市&#…...
晋中营销型网站建设/学习软件的网站
前言 2006初,我接到了公司分配的一个遗留项目,让我负责一个基于C/S的系统的服务器端。其实是系统是基于HTTP协议的,因为负责客户端的同事对于服务器端编程不甚了解,虽然使用PHP对熟悉C++的他来说是驾轻就熟…...