Class类
对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。
Class类的常用方法
获取Class对象的四种方式
- 通过抑制具体类,通过类的class属性进行获取。该方法最为安全可靠,程序性能最高
Class clazz = String.class; - 已知某个类的实例,调用该实例的getClass()方法获取Class对象
Class clazz = “test”.getClass(); - 已知一个类的全类名进行获取。
Class clazz = Class.forName(“java.lang.String”); - 通过类加载器获取
先获取本类的类加载器(应用类加载器(System classLoader))
再通过本类的类加载器,去获取java.lang.String的Class实例
ClassLoader cl = this.getClass().getClassLoader();
Class clazz4 = cl.loadClass(“类的全类名”);
invoke方法的使用
- Object 对应原方法的返回值,若原方法无返回值,此时返回null
- 若原方法若为静态方法,此时形参Object obj可为null
- 若原方法形参列表为空,则Object[] args为null
- 若原方法声明为private,则需要在调用此invoke()方法前,显式调用方法对象的setAccessible(true)方法,将可访问private的方法。
反射中属性的使用
在反射机制中,可以直接通过Field类操作类中的属性,通过Field类提供的set()和get()方法就可以完成设置和取得属性内容的操作。
public Field getField(String name) 返回此Class对象表示的类或接口的指定的public的Field。
public Field getDeclaredField(String name)返回此Class对象表示的类或接口的指定的Field。
在Field中:
public Object get(Object obj) 取得指定对象obj上此Field的属性内容
public void set(Object obj,Object value) 设置指定对象obj上此Field的属性内容
注:在类中属性都设置为private的前提下,在使用set()和get()方法时,首先要使用Field类中的setAccessible(true)方法将需要操作的属性设置为可以被外部访问。
public void setAccessible(true)访问私有属性时,让这个属性可见。