ToB企服应用市场:ToB评测及商务社交产业平台
标题:
别再重复造反射轮子了,Spring 中的 ReflectionUtils 工具类,应有尽有!
[打印本页]
作者:
莱莱
时间:
2024-2-18 08:57
标题:
别再重复造反射轮子了,Spring 中的 ReflectionUtils 工具类,应有尽有!
作者:策马踏清风
链接:
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开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4