# 反射工具类

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

注意

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

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

# 0. 取消 Java 的权限控制检查

在调用下述方法取消 Java 的权限检查之后,后续就可以执行、访问 Java 对象的私有属性、私有方法、私有构造器了。

// 取消 Java 的权限控制检查。
void makeAccessible(Field field) 

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

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

# 1. Field 相关操作

  • findField 方法

    查找/获取 Field

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

    /* 在类中查找指定属性 */
    Field findField(Class<?> clazz, String name) 
    
    /* 功能同上。多提供了属性的类型 */
    Field findField(Class<?> clazz, String name, Class<?> type) 
    
  • getField / setField / shallowCopyFieldState 方法

    读写属性值

    通过所上述方法(或其它方法)获得代表属性的 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)
    
  • doWithFields / doWithLocalFields

    遍历 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 相关方法

  • accessibleConstructor 方法

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

    查找 / 获得 Method
    /* 在类中查找指定方法。*/
    Method findMethod(Class<?> clazz, String name) 
    
    // 同上,额外提供方法参数类型作查找条件。
    Method findMethod(Class<?> clazz, String name, Class<?>... paramTypes) 
    
    // 获得类中所有方法,包括继承而来的。
    Method[] getAllDeclaredMethods(Class<?> leafClass) 
    
  • isEqualsMethod / isHashCodeMethod / isToStringMethod 方法

    判断 Method 是否是 ...
    /* 是否是 equals() 方法 */
    boolean isEqualsMethod(Method method) 
    
    /* 是否是 hashCode() 方法 */
    boolean isHashCodeMethod(Method method) 
    
    /* 是否是 toString() 方法 */
    boolean isToStringMethod(Method method) 
    
  • isObjectMethod / declaresException 方法

    判断 Method 是否是 ...
    /* 是否是从 Object 类继承而来的方法 */
    boolean isObjectMethod(Method method) 
    
    /* 检查一个方法是否声明抛出指定异常。*/
    boolean declaresException(Method method, Class<?> exceptionType) 
    

# 2.3

  • invokeMethod 方法

    执行 Field
    /* 执行方法 */
    Object invokeMethod(Method method, Object target)  
    
    /* 同上 */
    Object invokeMethod(Method method, Object target, Object... args) 
    
  • doWithMethods / doWithLocalMethods 方法

    遍历执行 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 相关方法

  • accessibleConstructor 方法

    查找/获得 Constructor

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

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