反射 reflect
反射机制是指在运行状态时,对于一个类,能够获取这个类的所有方法和属性,对于任意一个实例对象,可以调用它的任意方法和属性,这种动态的获取类的信息以及动态调用对象方法的功能称为Java语言的反射机制。
在Java中Class类和java.lang.reflect类库一起对反射技术提供支持。
在reflect包中,我们常用的类有如下:
- Constructor: Class对象所表示的类的构造方法,利用它可以在运行时,动态创建实例对象
- Field:Class对象所表示的类的成员变量,通过它可以在运行时,动态修改类的成员变量
- Method:Class对象所表示的类的成员方法, 通过它可以动态调用对象的方法(包含private)
Constructor类常用Api
Constructor 对象是通过Class类中的方法获取
方法返回值 | 方法名称 | 方法说明 |
---|---|---|
static Class<?> | forName(String className) | 返回与带有给定字符串名的类或接口相关联的 Class 对象。会初始化该类 |
Constructor<T> | getConstructor(Class<?>... parameterTypes) | 返回指定参数类型、具有public访问权限的构造函数对象 |
Constructor<?>[] | getConstructors() | 返回所有具有public访问权限的构造函数的Constructor对象数组 |
Constructor<T> | getDeclaredConstructor(Class<?>... parameterTypes) | 返回指定参数类型、所有声明的(包括private)构造函数对象 |
Constructor<?>[] | getDeclaredConstructor() | 返回所有声明的(包括private)构造函数对象 |
T | newInstance() | 创建此 Class 对象所表示的类的一个新实例。 |
Field类常用Api
方法返回值 | 方法名称 | 方法说明 |
---|---|---|
Field | getDeclaredField(String name) | 获取指定name名称的(包含private修饰的)字段,不包括继承的字段 |
Field[] | getDeclaredField() | 获取Class对象所表示的类或接口的所有(包含private修饰的)字段,不包括继承的字段 |
Field | getField(String name) | 获取指定name名称、具有public修饰的字段,包含继承字段 |
Field[] | getField() | 获取修饰符为public的字段,包含继承字段 |
Method类常用Api
方法返回值 | 方法名称 | 方法说明 |
---|---|---|
Method | getDeclaredMethod(String name, Class<?>... parameterTypes) | 返回一个指定参数的Method对象, 该对象反映此 Class 对象所表示的类或接口的指定已声明方法。 |
Method[] | getDeclaredMethod() | 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 |
Method | getMethod(String name, Class<?>... parameterTypes) | 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。 |
Method[] | getMethods() | 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。 |
Array类常用Api
方法返回值 | 方法名称 | 方法说明 |
---|---|---|
Class<?> | getComponentType() | 返回表示数组元素类型的 Class,即数组的类型 |
boolean | isArray() | 判定此 Class 对象是否表示一个数组类。 |