Package com.luna.common.reflect
Class ReflectUtils
java.lang.Object
com.luna.common.reflect.ReflectUtils
反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.
- Author:
- luna
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionstatic RuntimeException
将反射时的checked exception转换为unchecked exception.static Field
getAccessibleField
(Object obj, String fieldName) 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问.static Method
getAccessibleMethod
(Object obj, String methodName, Class<?>... parameterTypes) 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.static Method
getAccessibleMethodByName
(Object obj, String methodName, int argsNum) 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.static <T> Class<T>
getClassGenricType
(Class clazz) 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处 如无法找到, 返回Object.class.static Class
getClassGenricType
(Class clazz, int index) 通过反射, 获得Class定义中声明的父类的泛型参数的类型.static <E> E
getFieldValue
(Object obj, String fieldName) 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.static Object
获取 目标对象static Class<?>
getUserClass
(Object instance) static <E> E
invokeGetter
(Object obj, String propertyName) 调用Getter方法.static <E> E
invokeMethod
(Object obj, String methodName, Class<?>[] parameterTypes, Object[] args) 直接调用对象方法, 无视private/protected修饰符.static <E> E
invokeMethodByName
(Object obj, String methodName, Object[] args) 直接调用对象方法, 无视private/protected修饰符, 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用.static <E> void
invokeSetter
(Object obj, String propertyName, E value) 调用Setter方法, 仅匹配方法名。 支持多级,如:对象名.对象名.方法static void
makeAccessible
(Field field) 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。static void
makeAccessible
(Method method) 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。static <E> void
setFieldValue
(Object obj, String fieldName, E value) 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数.
-
Constructor Details
-
ReflectUtils
public ReflectUtils()
-
-
Method Details
-
getTarget
获取 目标对象- Parameters:
proxy
- 代理对象- Returns:
- Throws:
Exception
-
invokeGetter
调用Getter方法. 支持多级,如:对象名.对象名.方法 -
invokeSetter
调用Setter方法, 仅匹配方法名。 支持多级,如:对象名.对象名.方法 -
getFieldValue
直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数. -
setFieldValue
直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数. -
invokeMethod
public static <E> E invokeMethod(Object obj, String methodName, Class<?>[] parameterTypes, Object[] args) 直接调用对象方法, 无视private/protected修饰符. 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用. 同时匹配方法名+参数类型, -
invokeMethodByName
直接调用对象方法, 无视private/protected修饰符, 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用. 只匹配函数名,如果有多个同名函数调用第一个。 -
getAccessibleField
循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. 如向上转型到Object仍无法找到, 返回null. -
getAccessibleMethod
循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. 如向上转型到Object仍无法找到, 返回null. 匹配函数名+参数类型。 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) -
getAccessibleMethodByName
循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. 如向上转型到Object仍无法找到, 返回null. 只匹配函数名。 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) -
makeAccessible
改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 -
makeAccessible
改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 -
getClassGenricType
通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处 如无法找到, 返回Object.class. -
getClassGenricType
通过反射, 获得Class定义中声明的父类的泛型参数的类型. 如无法找到, 返回Object.class. -
getUserClass
-
convertReflectionExceptionToUnchecked
将反射时的checked exception转换为unchecked exception.
-