# 反射工具类

ReflectionUtils 类位于 org.springframework.util 包。它封装了常用的反射相关的操作。

注意

实验反射效果时,不要使用内部类,或同文件多类的形式,必须使用标准形式。即类前必须有 public 修饰。

以下方法均为 static 方法,因此省略显示 static 关键字。

# 1. Field 相关操作

# 1.1 查找/获取 Field

在类定义中查找属性,返回代表这个属性的 Field 对象。

/* 在类中查找指定属性 */
Field findField(Class<?> clazz, String name) 

/* 功能同上。多提供了属性的类型 */
Field findField(Class<?> clazz, String name, Class<?> type) 

# 1.2 读写属性值

通过所上述方法(或其它方法)获得代表属性的 File 对象后,可以去读写某个对象的这个属性。(当然,前提是该对象有这么个属性)。

/* 获取 target 对象的 field 属性值 */
Object getField(Field field, Object target) 

/* 设置 target 对象的 field 属性值,值为 value */
void setField(Field field, Object target, Object value) 

/* 同类对象属性对等赋值。*/
void shallowCopyFieldState(Object src, Object dest)

/* 取消 Java 的权限控制检查。以便后续读写该私有属性 */
void makeAccessible(Field field) 

# 1.3 遍历 Field

/* 对类的每个属性执行 callback */
void doWithFields(Class<?> clazz, ReflectionUtils.FieldCallback fc) 

/* 同上,多了个属性过滤功能。 */
void doWithFields(Class<?> clazz, ReflectionUtils.FieldCallback fc, ReflectionUtils.FieldFilter ff) 

/* 同 doWithFields,但不包括继承而来的属性。*/
void doWithLocalFields(Class<?> clazz, ReflectionUtils.FieldCallback fc) 

# 1.4 其他

/* 是否为一个 "public static final" 属性。*/
boolean isPublicStaticFinal(Field field) 

# 2. Method 相关方法

# 2.1 查找/获得 Method

/* 在类中查找指定方法。*/
Method findMethod(Class<?> clazz, String name) 

// 同上,额外提供方法参数类型作查找条件。
Method findMethod(Class<?> clazz, String name, Class<?>... paramTypes) 

// 获得类中所有方法,包括继承而来的。
Method[] getAllDeclaredMethods(Class<?> leafClass) 

// 在类中查找指定构造方法
<T> Constructor<T> accessibleConstructor(Class<T> clazz, Class<?>... parameterTypes) 

# 2.2 判断 Method

/* 是否是 equals() 方法 */
boolean isEqualsMethod(Method method) 

/* 是否是 hashCode() 方法 */
boolean isHashCodeMethod(Method method) 

/* 是否是 toString() 方法 */
boolean isToStringMethod(Method method) 

/* 是否是从 Object 类继承而来的方法 */
boolean isObjectMethod(Method method) 

/* 检查一个方法是否声明抛出指定异常。*/
boolean declaresException(Method method, Class<?> exceptionType) 

# 2.3 执行 Field

/* 执行方法 */
Object invokeMethod(Method method, Object target)  

/* 同上 */
Object invokeMethod(Method method, Object target, Object... args) 

/* 取消 Java 权限检查。以便后续执行该私有方法 */
void makeAccessible(Method method) 

/* 取消 Java 权限检查。以便后续执行私有构造方法 */
void makeAccessible(Constructor<?> ctor) 

# 2.4 遍历执行 Method

/* 遍历执行类中的每个方法。包括从父类继承而来的方法。 */
void doWithMethods(Class<?> clazz, ReflectionUtils.MethodCallback mc) 

/* 同上。增加了匹配/过滤功能。*/
void doWithMethods(Class<?> clazz, ReflectionUtils.MethodCallback mc, ReflectionUtils.MethodFilter mf) 

/* 同上。不包括从父类继承而来的方法。*/
void doWithLocalMethods(Class<?> clazz, ReflectionUtils.MethodCallback mc) 

# 3. Constructor 相关方法

# 3.1 查找/获得 Constructor

在指定的类信息中查找该类是否有,对应参数的构造函数:

Constructor<T> accessibleConstructor(Class<T> clazz, Class<?>... parameterTypes);

# 3.2 设置 Constructor 访问权限

对于不具备操作权限的构造器,在执行它之前,需要将其设置为可操作。

void makeAccessible(Constructor<?> ctor);