作者:策马踏清风
链接:https://www.jianshu.com/p/756778f5dc87
ReflectionUtils
是spring
针对反射提供的工具类。
handleReflectionException异常处理
推荐一个开源免费的 Spring Boot 实战项目:
https://github.com/javastacks/spring-boot-best-practice
源码:
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最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!