机制原理
获取Class对象的三种方式
1,Class.forname(“全类名”):将字节码文件加载进内存,返回Class对象
多用于配置文件,将类名定义在配置文件中。读取文件,加载类
2,类名.class:通过类名的属性class获取
多用于参数的传递
3,对象.getClass():getClass()方法在object类中定义
多用于对象的获取字节码的方式
//1,Class.forName("全类名"),类名前需要完整的包路径,需要异常处理,会因找不到类而报错
Class c1 = Class.forName("hhuc.Person");
//2,类名.class
Class c2 = Person.class;
//3,对象.getClass(),object的子类都有这个方法,返回对象的Class对象
Person p = new Person();
Class c3 = p.getClass();
//内存中每个类的Class对象只有一个,因为类加载器只会加载一次,无论new多少个对象,镜子里的自己都只有一个。下面的比较都是返回true
System.out.println(c1 == c2);
System.out.println(c1 == c3);
获取Class对象后的方法的使用
//注意只能查到public成员变量
Field[] fields = c2.getFields();
for(Field field : fields){
System.out.println(field)
}
getField(String name),获取类的单个field对象
对成员变量操作,注意参数是实例对象,相当于获得实例化的成员变量
getDeclaredField就很厉害了,可以获取所以声明的成员变量包括private,因为在反射中不存在私有,你的就是我的
field对象.setAccessible(true);//暴力反射,直接忽略安全检查,无视权限问题
constructor构造器对象的操作
获取构造器
创建对象
//Class对象中有一个等价无参构造器初始化的方法
object o = c2.newInstance();
Method对象操作
Method对象的获取
方法的执行,invoke传一个实例对象进去就行
参考了某个b站视频后总结,具体地址不记得了 -_-