别再重复造反射轮子了,Spring 中的 ReflectionUtils 工具类,应有尽有!

这篇具有很好参考价值的文章主要介绍了别再重复造反射轮子了,Spring 中的 ReflectionUtils 工具类,应有尽有!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者:策马踏清风
链接:https://www.jianshu.com/p/756778f5dc87

ReflectionUtilsspring针对反射提供的工具类。

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)方法使用ConcurrentReferenceHashMapField缓存,并优先从缓存中取。

  • 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开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!文章来源地址https://www.toymoban.com/news/detail-760025.html

到了这里,关于别再重复造反射轮子了,Spring 中的 ReflectionUtils 工具类,应有尽有!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Cloud 轻松解决跨域,别再乱用了!

    在Spring Cloud项目中,前后端分离目前很常见,在调试时,会遇到两种情况的跨域: 前端页面通过不同域名或IP访问微服务的后台,例如前端人员会在本地起HttpServer 直连后台开发本地起的服务,此时,如果不加任何配置,前端页面的请求会被浏览器跨域限制拦截,所以,业务

    2024年02月08日
    浏览(32)
  • 别再上当受骗,使用身份证真伪在线核验工具!

        随着网络的普及和互联网时代的来临,网络诈骗也日益猖獗。其中,冒用他人身份证信息进行诈骗是一种常见的手段。很多人因为不知道如何辨别身份证的真伪,而陷入骗局。为了帮助大家更好地保护自己的财产安全,现在有一种身份证真伪在线核验工具,让我们能够轻

    2024年04月09日
    浏览(90)
  • 使用Graalvm+Swing搓了个原生桌面应用的轮子:文件差异对比工具,附轮子源码

    1、DFDiff介绍 当前已实现的功能比较两个文件夹内的文件差异,已支持文件差异对比。 2、软件架构 软件架构说明 开发环境是在OpenJDK17,UI使用的是Swing + SwingX扩展控件,使用Graalvm编译为原生应用。 文件列表使用的Swingx组件的JXTreeTable。 文件差异对比使用的Swingx组件的JXTabl

    2024年02月08日
    浏览(34)
  • Spring Boot 别再用 Date 作为入参了,LocalDateTime、LocalDate 真香!

    作者:TinyThing 链接:https://www.jianshu.com/p/b52db905f020 项目中使用LocalDateTime系列作为dto中时间的类型,但是spring收到参数后总报错,为了全局配置时间类型转换,尝试了如下3中方法。 注:本文基于Springboot2.0测试,如果无法生效可能是spring版本较低导致的。PS:如果你的Controll

    2024年02月11日
    浏览(31)
  • 一款基于 Spring Boot 的公众号管理系统,已开源,别再自己写了!

    来源:https://gitee.com/niefy/wx-manage wx-manage是一个支持公众号管理系统,支持多公众号接入。 wx-manage提供公众号菜单、自动回复、公众号素材、简易CMS、等管理功能,请注意本项目仅为管理后台界面,需配合后端程序wx-api一起使用。 wx-manage是一个微信公众号管理系统,目前主要

    2024年02月08日
    浏览(33)
  • 还在手动造轮子?试试这款可以轻松集成多种支付渠道的工具!

    大家好,我是 Java陈序员 。 随着电商的兴起,各种支付也是蓬勃发展。 微信支付、支付宝支付、银联支付等各种支付方式可是深入到日常生活中。可以说,扫码支付给我们的生活带来了极大的便利。 同时,随着市场需求的变化,这也要求我们在企业开发中,需要集成第三方

    2024年02月05日
    浏览(33)
  • mybatis-plus中的in的使用,是传Array?还是传List?别再纠结了

    先看个技术题吧。 下面两段代码,执行testFoo,结果分别是什么?   一眼看出来结果的同学,恭喜你,本文内容可以略过。   下面是正文。   我们在查询或更新数据的时候,有时要用到in来过滤数据。比如 SELECT * FROM emax_scbg_order WHERE order_no IN (1305679009380433922,1305405259472830465

    2024年02月14日
    浏览(34)
  • Spring Boot 中的 CD 工具

    在现代软件开发中,持续交付(Continuous Delivery,简称 CD)已经成为了一个非常重要的开发模式。CD 工具可以帮助我们自动化构建、测试、部署和发布软件,提高软件交付的速度和质量。在 Spring Boot 中,有许多优秀的 CD 工具可以使用。本文将介绍一些常用的 CD 工具,并说明如

    2024年02月12日
    浏览(34)
  • Java中的Reflection(反射)、暴力反射

    1.1 反射的出现背景 Java程序中,所有的对象都有两种类型: 编译时类型 和 运行时类型 ,而很多时候对象的编译时类型和运行时类型 不一致 。 例如: 如上 :某些变量或形参的声明类型是 Object 类型,但是程序却需要调用该对象运行时类型的方法,该方法不是Object中的方法

    2024年02月04日
    浏览(32)
  • Spring框架与反射

    Spring框架是Java开发中广泛使用的一个强大且全面的框架,它在其核心和各个组件中大量利用了Java反射机制。反射在Spring中的应用主要体现在依赖注入、数据绑定、AOP(面向切面编程)等方面。 1. 依赖注入(Dependency Injection) Spring框架的一个核心特性是依赖注入(DI),它允

    2024年01月24日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包