通过反射获取Class对象的三种方法对应java代码在计算机中的三个阶段:
-
源代码阶段:这个时候java文件和class文件还存储在硬盘中,未加载到内存,想要获取这个Class需要使用Class.forName("全类名")进行加载;
(参数为字符串,多用于配置文件,读取文件加载类)
-
当一个类已经被加载到内存中了,可以使用 “类名.class” 获取;
(多用于参数的传递)
-
当一个类被加载到内存中并且被实例化了,就可以调用对象的 “getClass()” 方法获取Class。
(多用于对象的获取字节码的方式)
重要结论:
- 同一个(*.class)文件在一次程序运行过程中,只会被加载一次,使用三种方式获取到的Class对象均为一个Class对象。
获取Field:
- class.getFields() & class.getDeclaredFields();也可以获取指定名称的Field;
- field.get(obj) & field.set(obj,value);获取或者设置field的值,传入的obj指定一个对象;注意在获取private修饰的field时要先设置:field.setAccessible(true);
获取Constructor:
-
class.getConstructor(...),例如:
Constructor constructor = personClass.getConstructor(String.class, int.class); //使用有参构造器构造对象 Object obj=constructor.newInstance("name",23);
-
当然也可以获取无参构造,并通过无参构造生成对象,不过建议直接使用Class的newInstance()方法。
Object o = personClass.newInstance();
-
注意,和Field一样,也有declared与setaccessible相关特性
获取Method:
- class.getMethod()
- class.getMethods()
- method.invoke(obj,arg) //执行方法,obj为方法载体,arg为方法参数
- 也有declared与setaccessible相关特性