public class ReflectUtil extends Object
Constructor and Description |
---|
ReflectUtil() |
Modifier and Type | Method and Description |
---|---|
static <T> Constructor<T> |
getConstructor(Class<T> clazz,
Class<?>... parameterTypes)
查找类中的指定参数的构造方法,如果找到构造方法,会自动设置可访问为true
|
static <T> Constructor<T>[] |
getConstructors(Class<T> beanClass)
获得一个类中所有构造列表
|
static Constructor<?>[] |
getConstructorsDirectly(Class<?> beanClass)
获得一个类中所有构造列表,直接反射获取,无缓存
|
static Field |
getField(Class<?> beanClass,
String name)
查找指定类中的指定name的字段(包括非public字段),也包括父类和Object类的字段, 字段不存在则返回
null |
static Map<String,Field> |
getFieldMap(Class<?> beanClass)
获取指定类中字段名和字段对应的有序Map,包括其父类中的字段
如果子类与父类中存在同名字段,则这两个字段同时存在,子类字段在前,父类字段在后。 |
static String |
getFieldName(Field field)
获取字段名,如果存在
Alias 注解,读取注解的值作为名称 |
static Field[] |
getFields(Class<?> beanClass)
获得一个类中所有字段列表,包括其父类中的字段
如果子类与父类中存在同名字段,则这两个字段同时存在,子类字段在前,父类字段在后。 |
static Field[] |
getFields(Class<?> beanClass,
Filter<Field> fieldFilter)
获得一个类中所有满足条件的字段列表,包括其父类中的字段
如果子类与父类中存在同名字段,则这两个字段同时存在,子类字段在前,父类字段在后。 |
static Field[] |
getFieldsDirectly(Class<?> beanClass,
boolean withSuperClassFields)
获得一个类中所有字段列表,直接反射获取,无缓存
如果子类与父类中存在同名字段,则这两个字段同时存在,子类字段在前,父类字段在后。 |
static Object[] |
getFieldsValue(Object obj)
获取所有字段的值
|
static Object[] |
getFieldsValue(Object obj,
Filter<Field> filter)
获取所有字段的值
|
static Object |
getFieldValue(Object obj,
Field field)
获取字段值
|
static Object |
getFieldValue(Object obj,
String fieldName)
获取字段值
|
static Method |
getMethod(Class<?> clazz,
boolean ignoreCase,
String methodName,
Class<?>... paramTypes)
查找指定方法 如果找不到对应的方法则返回
null 此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回 null 。 |
static Method |
getMethod(Class<?> clazz,
String methodName,
Class<?>... paramTypes)
查找指定方法 如果找不到对应的方法则返回
null
此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回null 。 |
static Method |
getMethodByName(Class<?> clazz,
boolean ignoreCase,
String methodName)
按照方法名查找指定方法名的方法,只返回匹配到的第一个方法,如果找不到对应的方法则返回
null
此方法只检查方法名是否一致,并不检查参数的一致性。 |
static Method |
getMethodByName(Class<?> clazz,
String methodName)
按照方法名查找指定方法名的方法,只返回匹配到的第一个方法,如果找不到对应的方法则返回
null
此方法只检查方法名是否一致,并不检查参数的一致性。 |
static Method |
getMethodByNameIgnoreCase(Class<?> clazz,
String methodName)
按照方法名查找指定方法名的方法,只返回匹配到的第一个方法,如果找不到对应的方法则返回
null
此方法只检查方法名是否一致(忽略大小写),并不检查参数的一致性。 |
static Method |
getMethodIgnoreCase(Class<?> clazz,
String methodName,
Class<?>... paramTypes)
忽略大小写查找指定方法,如果找不到对应的方法则返回
null
此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回null 。 |
static Set<String> |
getMethodNames(Class<?> clazz)
获得指定类中的方法名
去重重载的方法 |
static Method |
getMethodOfObj(Object obj,
String methodName,
Object... args)
查找指定对象中的所有方法(包括非public方法),也包括父对象和Object类的方法
此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回
null 。 |
static Method[] |
getMethods(Class<?> beanClass)
获得一个类中所有方法列表,包括其父类中的方法
|
static Method[] |
getMethods(Class<?> clazz,
Filter<Method> filter)
获得指定类过滤后的方法列表
|
static Method[] |
getMethodsDirectly(Class<?> beanClass,
boolean withSupers,
boolean withMethodFromObject)
获得一个类中所有方法列表,直接反射获取,无缓存
接口获取方法和默认方法,获取的方法包括: 本类中的所有方法(包括static方法) 父类中的所有方法(包括static方法) Object中(包括static方法) |
static Method |
getPublicMethod(Class<?> clazz,
String methodName,
Class<?>... paramTypes)
查找指定Public方法 如果找不到对应的方法或方法不为public的则返回
null |
static Set<String> |
getPublicMethodNames(Class<?> clazz)
获得指定类本类及其父类中的Public方法名
去重重载的方法 |
static Method[] |
getPublicMethods(Class<?> clazz)
获得本类及其父类所有Public方法
|
static List<Method> |
getPublicMethods(Class<?> clazz,
Filter<Method> filter)
获得指定类过滤后的Public方法列表
TODO 6.x此方法更改返回Method[] |
static List<Method> |
getPublicMethods(Class<?> clazz,
Method... excludeMethods)
获得指定类过滤后的Public方法列表
|
static List<Method> |
getPublicMethods(Class<?> clazz,
String... excludeMethodNames)
获得指定类过滤后的Public方法列表
|
static Object |
getStaticFieldValue(Field field)
获取静态字段值
|
static boolean |
hasField(Class<?> beanClass,
String name)
查找指定类中是否包含指定名称对应的字段,包括所有字段(包括非public字段),也包括父类和Object类的字段
|
static <T> T |
invoke(Object obj,
Method method,
Object... args)
执行方法
对于用户传入参数会做必要检查,包括:
1、忽略多余的参数
2、参数不够补齐默认值
3、传入参数为null,但是目标参数类型为原始类型,做转换
|
static <T> T |
invoke(Object obj,
String methodName,
Object... args)
执行对象中指定方法
如果需要传递的参数为null,请使用NullWrapperBean来传递,不然会丢失类型信息
|
static <T> T |
invokeRaw(Object obj,
Method method,
Object... args)
执行方法
对于用户传入参数会做必要检查,包括:
1、忽略多余的参数
2、参数不够补齐默认值
3、传入参数为null,但是目标参数类型为原始类型,做转换
|
static <T> T |
invokeStatic(Method method,
Object... args)
执行静态方法
|
static <T> T |
invokeWithCheck(Object obj,
Method method,
Object... args)
执行方法
执行前要检查给定参数: 1. |
static boolean |
isEmptyParam(Method method)
是否为无参数方法
|
static boolean |
isEqualsMethod(Method method)
是否为equals方法
|
static boolean |
isGetterOrSetter(Method method,
boolean ignoreCase)
检查给定方法是否为Getter或者Setter方法,规则为:
方法参数必须为0个或1个 方法名称不能是getClass 如果是无参方法,则判断是否以“get”或“is”开头 如果方法参数1个,则判断是否以“set”开头 |
static boolean |
isGetterOrSetterIgnoreCase(Method method)
检查给定方法是否为Getter或者Setter方法,规则为:
方法参数必须为0个或1个 如果是无参方法,则判断是否以“get”或“is”开头 如果方法参数1个,则判断是否以“set”开头 |
static boolean |
isHashCodeMethod(Method method)
是否为hashCode方法
|
static boolean |
isOuterClassField(Field field)
是否为父类引用字段
当字段所在类是对象子类时(对象中定义的非static的class),会自动生成一个以"this$0"为名称的字段,指向父类对象 |
static boolean |
isToStringMethod(Method method)
是否为toString方法
|
static <T> T |
newInstance(Class<T> clazz,
Object... params)
实例化对象
|
static <T> T |
newInstance(String clazz)
实例化对象
|
static <T> T |
newInstanceIfPossible(Class<T> type)
尝试遍历并调用此类的所有构造方法,直到构造成功并返回
对于某些特殊的接口,按照其默认实现实例化,例如:
Map -》 HashMap
Collction -》 ArrayList
List -》 ArrayList
Set -》 HashSet
|
static void |
removeFinalModify(Field field)
设置final的field字段可以被修改
只要不会被编译器内联优化的 final 属性就可以通过反射有效的进行修改 -- 修改后代码中可使用到新的值;
以下属性,编译器会内联优化,无法通过反射修改:
基本类型 byte, char, short, int, long, float, double, boolean
Literal String 类型(直接双引号字符串)
以下属性,可以通过反射修改:
基本类型的包装类 Byte、Character、Short、Long、Float、Double、Boolean
字符串,通过 new String("")实例化
自定义java类
|
static <T extends AccessibleObject> |
setAccessible(T accessibleObject)
设置方法为可访问(私有方法可以被外部调用)
|
static void |
setFieldValue(Object obj,
Field field,
Object value)
设置字段值
若值类型与字段类型不一致,则会尝试通过 Convert 进行转换若字段类型是原始类型而传入的值是 null,则会将字段设置为对应原始类型的默认值(见 ClassUtil.getDefaultValue(Class) )如果是final字段,setFieldValue,调用这可以先调用 removeFinalModify(Field) 方法去除final修饰符 |
static void |
setFieldValue(Object obj,
String fieldName,
Object value)
设置字段值
若值类型与字段类型不一致,则会尝试通过 Convert 进行转换若字段类型是原始类型而传入的值是 null,则会将字段设置为对应原始类型的默认值(见 ClassUtil.getDefaultValue(Class) )
如果是final字段,setFieldValue,调用这可以先调用 removeFinalModify(Field) 方法去除final修饰符 |
public static <T> Constructor<T> getConstructor(Class<T> clazz, Class<?>... parameterTypes)
T
- 对象类型clazz
- 类parameterTypes
- 参数类型,只要任何一个参数是指定参数的父类或接口或相等即可,此参数可以不传public static <T> Constructor<T>[] getConstructors(Class<T> beanClass) throws SecurityException
T
- 构造的对象类型beanClass
- 类,非null
SecurityException
- 安全检查异常public static Constructor<?>[] getConstructorsDirectly(Class<?> beanClass) throws SecurityException
beanClass
- 类SecurityException
- 安全检查异常public static boolean hasField(Class<?> beanClass, String name) throws SecurityException
beanClass
- 被查找字段的类,不能为nullname
- 字段名SecurityException
- 安全异常public static String getFieldName(Field field)
Alias
注解,读取注解的值作为名称field
- 字段public static Field getField(Class<?> beanClass, String name) throws SecurityException
null
beanClass
- 被查找字段的类,不能为nullname
- 字段名SecurityException
- 安全异常public static Map<String,Field> getFieldMap(Class<?> beanClass)
beanClass
- 类public static Field[] getFields(Class<?> beanClass) throws SecurityException
beanClass
- 类SecurityException
- 安全检查异常public static Field[] getFields(Class<?> beanClass, Filter<Field> fieldFilter) throws SecurityException
beanClass
- 类fieldFilter
- field过滤器,过滤掉不需要的field,null
返回原集合SecurityException
- 安全检查异常public static Field[] getFieldsDirectly(Class<?> beanClass, boolean withSuperClassFields) throws SecurityException
beanClass
- 类withSuperClassFields
- 是否包括父类的字段列表SecurityException
- 安全检查异常public static Object getFieldValue(Object obj, String fieldName) throws UtilException
obj
- 对象,如果static字段,此处为类fieldName
- 字段名UtilException
- 包装IllegalAccessException异常public static Object getStaticFieldValue(Field field) throws UtilException
field
- 字段UtilException
- 包装IllegalAccessException异常public static Object getFieldValue(Object obj, Field field) throws UtilException
obj
- 对象,static字段则此字段为nullfield
- 字段UtilException
- 包装IllegalAccessException异常public static Object[] getFieldsValue(Object obj)
obj
- bean对象,如果是static字段,此处为类classpublic static Object[] getFieldsValue(Object obj, Filter<Field> filter)
obj
- bean对象,如果是static字段,此处为类classfilter
- 字段过滤器,,null
返回原集合public static void setFieldValue(Object obj, String fieldName, Object value) throws UtilException
Convert
进行转换ClassUtil.getDefaultValue(Class)
)
如果是final字段,setFieldValue,调用这可以先调用 removeFinalModify(Field)
方法去除final修饰符obj
- 对象,static字段则此处传ClassfieldName
- 字段名value
- 值,当值类型与字段类型不匹配时,会尝试转换UtilException
- 包装IllegalAccessException异常public static void setFieldValue(Object obj, Field field, Object value) throws UtilException
Convert
进行转换ClassUtil.getDefaultValue(Class)
)removeFinalModify(Field)
方法去除final修饰符obj
- 对象,如果是static字段,此参数为nullfield
- 字段value
- 值,当值类型与字段类型不匹配时,会尝试转换UtilException
- UtilException 包装IllegalAccessException异常public static boolean isOuterClassField(Field field)
field
- 字段public static Set<String> getPublicMethodNames(Class<?> clazz)
clazz
- 类public static Method[] getPublicMethods(Class<?> clazz)
clazz
- 查找方法的类public static List<Method> getPublicMethods(Class<?> clazz, Filter<Method> filter)
clazz
- 查找方法的类filter
- 过滤器public static List<Method> getPublicMethods(Class<?> clazz, Method... excludeMethods)
clazz
- 查找方法的类excludeMethods
- 不包括的方法public static List<Method> getPublicMethods(Class<?> clazz, String... excludeMethodNames)
clazz
- 查找方法的类excludeMethodNames
- 不包括的方法名列表public static Method getPublicMethod(Class<?> clazz, String methodName, Class<?>... paramTypes) throws SecurityException
null
clazz
- 类methodName
- 方法名paramTypes
- 参数类型SecurityException
- 无权访问抛出异常public static Method getMethodOfObj(Object obj, String methodName, Object... args) throws SecurityException
此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回null
。
obj
- 被查找的对象,如果为null
返回null
methodName
- 方法名,如果为空字符串返回null
args
- 参数SecurityException
- 无访问权限抛出异常public static Method getMethodIgnoreCase(Class<?> clazz, String methodName, Class<?>... paramTypes) throws SecurityException
null
此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回null
。
clazz
- 类,如果为null
返回null
methodName
- 方法名,如果为空字符串返回null
paramTypes
- 参数类型,指定参数类型如果是方法的子类也算SecurityException
- 无权访问抛出异常public static Method getMethod(Class<?> clazz, String methodName, Class<?>... paramTypes) throws SecurityException
null
此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回null
。
clazz
- 类,如果为null
返回null
methodName
- 方法名,如果为空字符串返回null
paramTypes
- 参数类型,指定参数类型如果是方法的子类也算SecurityException
- 无权访问抛出异常public static Method getMethod(Class<?> clazz, boolean ignoreCase, String methodName, Class<?>... paramTypes) throws SecurityException
null
null
。clazz
- 类,如果为null
返回null
ignoreCase
- 是否忽略大小写methodName
- 方法名,如果为空字符串返回null
paramTypes
- 参数类型,指定参数类型如果是方法的子类也算SecurityException
- 无权访问抛出异常public static Method getMethodByName(Class<?> clazz, String methodName) throws SecurityException
null
此方法只检查方法名是否一致,并不检查参数的一致性。
clazz
- 类,如果为null
返回null
methodName
- 方法名,如果为空字符串返回null
SecurityException
- 无权访问抛出异常public static Method getMethodByNameIgnoreCase(Class<?> clazz, String methodName) throws SecurityException
null
此方法只检查方法名是否一致(忽略大小写),并不检查参数的一致性。
clazz
- 类,如果为null
返回null
methodName
- 方法名,如果为空字符串返回null
SecurityException
- 无权访问抛出异常public static Method getMethodByName(Class<?> clazz, boolean ignoreCase, String methodName) throws SecurityException
null
此方法只检查方法名是否一致,并不检查参数的一致性。
clazz
- 类,如果为null
返回null
ignoreCase
- 是否忽略大小写methodName
- 方法名,如果为空字符串返回null
SecurityException
- 无权访问抛出异常public static Set<String> getMethodNames(Class<?> clazz) throws SecurityException
clazz
- 类SecurityException
- 安全异常public static Method[] getMethods(Class<?> clazz, Filter<Method> filter) throws SecurityException
clazz
- 查找方法的类filter
- 过滤器SecurityException
- 安全异常public static Method[] getMethods(Class<?> beanClass) throws SecurityException
beanClass
- 类,非null
SecurityException
- 安全检查异常public static Method[] getMethodsDirectly(Class<?> beanClass, boolean withSupers, boolean withMethodFromObject) throws SecurityException
beanClass
- 类或接口withSupers
- 是否包括父类或接口的方法列表withMethodFromObject
- 是否包括Object中的方法SecurityException
- 安全检查异常public static boolean isEqualsMethod(Method method)
method
- 方法public static boolean isHashCodeMethod(Method method)
method
- 方法public static boolean isToStringMethod(Method method)
method
- 方法public static boolean isEmptyParam(Method method)
method
- 方法public static boolean isGetterOrSetterIgnoreCase(Method method)
method
- 方法public static boolean isGetterOrSetter(Method method, boolean ignoreCase)
method
- 方法ignoreCase
- 是否忽略方法名的大小写public static <T> T newInstance(String clazz) throws UtilException
T
- 对象类型clazz
- 类名UtilException
- 包装各类异常public static <T> T newInstance(Class<T> clazz, Object... params) throws UtilException
T
- 对象类型clazz
- 类params
- 构造函数参数UtilException
- 包装各类异常public static <T> T newInstanceIfPossible(Class<T> type)
对于某些特殊的接口,按照其默认实现实例化,例如:
Map -》 HashMap Collction -》 ArrayList List -》 ArrayList Set -》 HashSet
T
- 对象类型type
- 被构造的类null
public static <T> T invokeStatic(Method method, Object... args) throws UtilException
T
- 对象类型method
- 方法(对象方法或static方法都可)args
- 参数对象UtilException
- 多种异常包装public static <T> T invokeWithCheck(Object obj, Method method, Object... args) throws UtilException
1. 参数个数是否与方法参数个数一致 2. 如果某个参数为null但是方法这个位置的参数为原始类型,则赋予原始类型默认值
T
- 返回对象类型obj
- 对象,如果执行静态方法,此值为null
method
- 方法(对象方法或static方法都可)args
- 参数对象UtilException
- 一些列异常的包装public static <T> T invoke(Object obj, Method method, Object... args) throws InvocationTargetRuntimeException, UtilException
对于用户传入参数会做必要检查,包括:
1、忽略多余的参数 2、参数不够补齐默认值 3、传入参数为null,但是目标参数类型为原始类型,做转换
T
- 返回对象类型obj
- 对象,如果执行静态方法,此值为null
method
- 方法(对象方法或static方法都可)args
- 参数对象InvocationTargetRuntimeException
- 目标方法执行异常UtilException
- IllegalAccessException
异常的包装public static <T> T invokeRaw(Object obj, Method method, Object... args) throws InvocationTargetException, IllegalAccessException
对于用户传入参数会做必要检查,包括:
1、忽略多余的参数 2、参数不够补齐默认值 3、传入参数为null,但是目标参数类型为原始类型,做转换
T
- 返回对象类型obj
- 对象,如果执行静态方法,此值为null
method
- 方法(对象方法或static方法都可)args
- 参数对象InvocationTargetException
- 目标方法执行异常IllegalAccessException
- 访问异常public static <T> T invoke(Object obj, String methodName, Object... args) throws UtilException
T
- 返回对象类型obj
- 方法所在对象methodName
- 方法名args
- 参数列表UtilException
- IllegalAccessException等异常包装NullWrapperBean
public static <T extends AccessibleObject> T setAccessible(T accessibleObject)
T
- AccessibleObject的子类,比如Class、Method、Field等accessibleObject
- 可设置访问权限的对象,比如Class、Method、Field等public static void removeFinalModify(Field field)
以下属性,编译器会内联优化,无法通过反射修改:
以下属性,可以通过反射修改:
//示例,移除final修饰符
class JdbcDialects {private static final List<Number> dialects = new ArrayList<>();}
Field field = ReflectUtil.getField(JdbcDialects.class, fieldName);
ReflectUtil.removeFinalModify(field);
ReflectUtil.setFieldValue(JdbcDialects.class, fieldName, dialects);
field
- 被修改的field,不可以为空UtilException
- IllegalAccessException等异常包装Copyright © 2024. All rights reserved.