Class ReflectUtils

java.lang.Object
com.luna.common.reflect.ReflectUtils

public class ReflectUtils extends Object
反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.
Author:
luna
  • Constructor Details

    • ReflectUtils

      public ReflectUtils()
  • Method Details

    • getTarget

      public static Object getTarget(Object proxy) throws Exception
      获取 目标对象
      Parameters:
      proxy - 代理对象
      Returns:
      Throws:
      Exception
    • invokeGetter

      public static <E> E invokeGetter(Object obj, String propertyName)
      调用Getter方法. 支持多级,如:对象名.对象名.方法
    • invokeSetter

      public static <E> void invokeSetter(Object obj, String propertyName, E value)
      调用Setter方法, 仅匹配方法名。 支持多级,如:对象名.对象名.方法
    • getFieldValue

      public static <E> E getFieldValue(Object obj, String fieldName)
      直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.
    • setFieldValue

      public static <E> void setFieldValue(Object obj, String fieldName, E value)
      直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数.
    • invokeMethod

      public static <E> E invokeMethod(Object obj, String methodName, Class<?>[] parameterTypes, Object[] args)
      直接调用对象方法, 无视private/protected修饰符. 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用. 同时匹配方法名+参数类型,
    • invokeMethodByName

      public static <E> E invokeMethodByName(Object obj, String methodName, Object[] args)
      直接调用对象方法, 无视private/protected修饰符, 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用. 只匹配函数名,如果有多个同名函数调用第一个。
    • getAccessibleField

      public static Field getAccessibleField(Object obj, String fieldName)
      循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. 如向上转型到Object仍无法找到, 返回null.
    • getAccessibleMethod

      public static Method getAccessibleMethod(Object obj, String methodName, Class<?>... parameterTypes)
      循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. 如向上转型到Object仍无法找到, 返回null. 匹配函数名+参数类型。 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
    • getAccessibleMethodByName

      public static Method getAccessibleMethodByName(Object obj, String methodName, int argsNum)
      循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. 如向上转型到Object仍无法找到, 返回null. 只匹配函数名。 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
    • makeAccessible

      public static void makeAccessible(Method method)
      改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
    • makeAccessible

      public static void makeAccessible(Field field)
      改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
    • getClassGenricType

      public static <T> Class<T> getClassGenricType(Class clazz)
      通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处 如无法找到, 返回Object.class.
    • getClassGenricType

      public static Class getClassGenricType(Class clazz, int index)
      通过反射, 获得Class定义中声明的父类的泛型参数的类型. 如无法找到, 返回Object.class.
    • getUserClass

      public static Class<?> getUserClass(Object instance)
    • convertReflectionExceptionToUnchecked

      public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e)
      将反射时的checked exception转换为unchecked exception.