别再重复造反射轮子了,Spring 中的 ReflectionUtils 工具类,应有尽有!
作者:策马踏清风
链接:https://www.jianshu.com/p/756778f5dc87
ReflectionUtils
是spring
针对反射提供的工具类。
handleReflectionException异常处理
推荐一个开源免费的 Spring Boot 实战项目:
源码:
public static void handleReflectionException(Exception ex) {
if (ex instanceof NoSuchMethodException) {
throw new IllegalStateException("Method not found: " + ex.getMessage());
}
if (ex instanceof IllegalAccessException) {
throw new IllegalStateException("Could not access method: " + ex.getMessage());
}
if (ex instanceof InvocationTargetException) {
handleInvocationTargetException((InvocationTargetException) ex);
}
if (ex instanceof RuntimeException) {
throw (RuntimeException) ex;
}
throw new UndeclaredThrowableException(ex);
}
主要是将反射中的异常分成几个部分,规范化输出
boolean declaresException(Method method, Class<?> exceptionType)
判断方法上是否声明了指定的异常类型
findField查找字段
Field findField(Class<?> clazz, String name, Class<?> type)
查找指定类的指定名称和指定类型的方法
public static Field findField(Class<?> clazz, String name, Class<?> type) {
Class<?> searchType = clazz;
while (Object.class != searchType && searchType != null) {
Field[] fields = getDeclaredFields(searchType);
for (Field field : fields) {
if ((name == null || name.equals(field.getName())) &&
(type == null || type.equals(field.getType()))) {
return field;
}
}
searchType = searchType.getSuperclass();
}
return null;
}
获取所有的方法,然后循环遍历,知道找到满足条件的返回
其中getDeclaredFields(searchType)
方法使用ConcurrentReferenceHashMap
将Field
缓存,并优先从缓存中取。
Field findField(Class<?> clazz, String name)
设置字段setField
void setField(Field field, Object target, Object value)
设置指定字段的值
直接使用Field.set/get
方法,然后格式化处理了异常Object getField(Field field, Object target)
获取指定字段的值
查找方法findMethod
Method findMethod(Class<?> clazz, String name, Class<?>... paramTypes)
查找方法,方法的参数是一个可变长的Class
Method findMethod(Class<?> clazz, String name)
直接查,不指定参数
调用方法invokeMethod
Object invokeMethod(Method method, Object target, Object... args)
调用方法Object invokeMethod(Method method, Object target)
简单版本
判断类
boolean declaresException(Method method, Class<?> exceptionType)
方法上是否声明了指定的异常boolean isPublicStaticFinal(Field field)
判断字段首付是public static final
的boolean isEqualsMethod(Method method)
判断方法是否是equals
方法boolean isHashCodeMethod(Method method)
判断方法是否是hashcode
方法boolean isToStringMethod(Method method)
判断方法是否是toString
方法boolean isObjectMethod(Method method)
判断方法是否是Object
类上的方法
操作
void makeAccessible(Field field)
使私有的字段可写void makeAccessible(Method method)
私有方法可调用void makeAccessible(Constructor<?> ctor)
私有构造器可调用void doWithLocalMethods(Class<?> clazz, MethodCallback mc)
遍历类上的方法,并执行回调
public interface MethodCallback {
void doWith(Method method) throws IllegalArgumentException, IllegalAccessException;
}
void doWithMethods(Class<?> clazz, MethodCallback mc, MethodFilter mf)
增加了一个方法过滤器
public interface MethodFilter {
boolean matches(Method method);
}
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
觉得不错,别忘了随手点赞+转发哦!