反射的概述
获取Class对象的三种方式
以下代码片段返回命名为 java.lang.Thread 的类的运行时 Class 描述符
1)通过Object类的getClass()方法
创建一个对象,通过getClass方法获取Class对象:
Thread t = new Thread ();
Class thread= t.getClass();//返回此 Object 的运行时类对象。
2)通过Class类的静态方法forName(),根据全类名获取Class对象
Class thread= Class.forName(" java.lang.Thread");
3)数据类型(基本和引用)的静态属性class
Class thread= Thread.class;
Class c = int.class; //自动装箱
Class c1 = String.class;
注意:一般,开发中使用第二种,因为第二种是一个字符串,而不是一个具体的类名。这样就可以把这样的字符串配置到配置文件中。
Class对象
Class类:常用类
成员变量:Field
构造方法: Constructor
成员方法:Method
反射:通过Class类的方法获取以上的三个对应的对象,然后通过Filed/Method/Contructor对象调用其方法去真正的使用类的成员、方法、构造
反射的使用
- 反射构造使用
Constructor<T> getContructor(Class<?>... paramTypes)
参数:parameterTypes - 参数数组 (class类型的参数)
返回值:一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
Constructor<?>[] getContructors()
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
Constructor<T> getDeclaredContructor(Class<?>... paramTypes)
参数:parameterTypes - 参数数组
返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
Constructor<?>[] getDeclaredContructors()
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
T newInstance()
返回 此对象所表示的类的一个新分配的实例。
- 反射属性使用:
参数:name - 字段名
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
Field[] getDeclaredFields()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
Field getField(String name)
参数:name - 字段名
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
Field[] getFields()
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
- 反射方法使用
返回一个 Method 对象,返回此 Class 对象所表示的类或接口的公共成员方法。
参数:name - 方法名 parameterTypes - 参数列表
Method[] getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口的公共成员方法。
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
参数:name - 方法名 parameterTypes - 参数数组
返回:一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法(不分什么修饰符修饰,都 可以获取到)。
Method[] getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认 (包)访问和私有方法,但不包括继承的方法。
- 访问使用方法
setAccessible(boolean flag)
将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值 为 false 则指示反射的对象应该实施 Java 语言访问检查。