Spring反射内置工具类ReflectionUtils

news2024/11/15 20:36:23

Spring反射内置工具类ReflectionUtils

  • 前言
  • 反射
    • 1,什么是反射
    • 2,反射的实现
      • 2.1获取class对象的三种实现
        • 2.1.1Object ——> getClass();
        • 2.1.2 任何数据对象(包括数据基本类型)都有一个静态的class属性
        • 通过Class类的静态方法:forName(String className)(常用)
  • 例子 获取类中hashMap的值
    • 1.1 通过JDK实现
    • 1.2 通过org.springframework.util.ReflectionUtils
  • 对属性的操作
    • public static Field findField(Class<?> clazz, String name) 在类中查找指定属性
    • public static Field findField(Class<?> clazz, @Nullable String name, @Nullable Class<?> type) 更精确的在类中查找指定属性,可以在指定属性的类型
    • public static Object getField(Field field, @Nullable Object target) 获取对象的值
    • void setField(Field field, Object target, Object value),可以设置 target 对象的 field 属性值,值为 value。
    • void makeAccessible(Field field),取消java的权限控制检查,方便private私有访问权限的操作。
  • 对方法的操作
    • Method findMethod(Class clazz, String name),在类中查找指定名字方法
    • Method findMethod(Class clazz, String name, Class... paramTypes),有的时候同一个类可能会有多个方法名相同,形参数不同的重载方法,可以使用这个方法更精确的在类中找到指定方法;
    • Method[] getAllDeclaredMethods(Class leafClass),获得类中所有方法,包括继承而来的。
    • 执行方法

前言

最近在搞通过sentinel熔断后,触发数据库代理ShardingSphere 代理直连DB的时候,这里需要通过反射获取sentinel熔断的规则map。原先是通过jdk反射机制,发现一堆异常处理,特别的不友好,代码整洁度和可阅读性也不是很好,后面发现spring给我们提供了一个ReflectionUtils。简直不要太香了。

反射

1,什么是反射

java反射机制在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态的获取信息以及动态的调用对象的方法的功能我们称之为java的反射机制

eg:类的class声明(class对象),变量(field),方法(method)等等信息,利用反射技术可以对一个类进行解剖,动态获取信息进行处理。

2,反射的实现

2.1获取class对象的三种实现

2.1.1Object ——> getClass();

 Demo demo = new Demo();
        Class<? extends Demo> clazz = demo.getClass();

2.1.2 任何数据对象(包括数据基本类型)都有一个静态的class属性

Class<Demo> clazz = Demo.class;

通过Class类的静态方法:forName(String className)(常用)

Class clazz = Class.forName("com.demo.Demo");

例子 获取类中hashMap的值

获取com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager 实体类中hashMap的数据,从以下JDK和spring的封装类中,我们能明显的感受到易用行。

在这里插入图片描述

1.1 通过JDK实现

 public void getRule()  {
        Class three = null;
        Object obj = null;
        Method getCircuitBreakers = null;
        try {
            three = Class.forName("com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager");
            obj = three.newInstance();
            Field[] declaredFields = three.getDeclaredFields();
            Field circuitBreakers1 = three.getDeclaredField("circuitBreakers");
            circuitBreakers1.setAccessible(true);
            HashMap<String, List<CircuitBreaker>> map = new HashMap<>();
            map = (HashMap<String, List<CircuitBreaker>>)circuitBreakers1.get(three);

            Method[] declaredMethods = three.getDeclaredMethods();
            Method getCircuitBreakers1 = three.getDeclaredMethod("getCircuitBreakers", String.class);

            getCircuitBreakers1.setAccessible(true);
            List<AbstractCircuitBreaker> invoke = (List<AbstractCircuitBreaker>) getCircuitBreakers1.invoke(obj, "http-api:/listFeedMessages");
            System.out.println("invoke--------"+JSONObject.toJSONString(invoke.get(0)));
            System.out.println(invoke.get(0).currentState().toString()+System.currentTimeMillis());
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        }
    }

在这里插入图片描述

1.2 通过org.springframework.util.ReflectionUtils

 public void getRuleByUtil() {
        try {
            Class clazz=Class.forName("com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager");
            Field circuitBreakers = ReflectionUtils.findField(clazz, "circuitBreakers");
            ReflectionUtils.makeAccessible(circuitBreakers);
            HashMap<String, List<CircuitBreaker>> map= (HashMap<String, List<CircuitBreaker>>) ReflectionUtils.getField(circuitBreakers,clazz);
            System.out.println(map);
        }catch (ClassNotFoundException e){
            throw new RuntimeException(e);
        }
    }

在这里插入图片描述

对属性的操作

public static Field findField(Class<?> clazz, String name) 在类中查找指定属性

public void getRuleByUtil() {
        try {
            Class clazz=Class.forName("com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager");
            Field circuitBreakers = ReflectionUtils.findField(clazz, "circuitBreakers");
        }catch (ClassNotFoundException e){
            throw new RuntimeException(e);
        }
    }

public static Field findField(Class<?> clazz, @Nullable String name, @Nullable Class<?> type) 更精确的在类中查找指定属性,可以在指定属性的类型

public void getRuleByUtil() {
        try {
            Class clazz=Class.forName("com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager");
            Field circuitBreakers = ReflectionUtils.findField(clazz, "circuitBreakers",Map.class);
        }catch (ClassNotFoundException e){
            throw new RuntimeException(e);
        }
    }

public static Object getField(Field field, @Nullable Object target) 获取对象的值

public void getRuleByUtil() {
        try {
            Class clazz=Class.forName("com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager");
            Field circuitBreakers = ReflectionUtils.findField(clazz, "circuitBreakers");
            ReflectionUtils.makeAccessible(circuitBreakers);
            HashMap<String, List<CircuitBreaker>> map= (HashMap<String, List<CircuitBreaker>>) ReflectionUtils.getField(circuitBreakers,clazz);
            System.out.println(map);
        }catch (ClassNotFoundException e){
            throw new RuntimeException(e);
        }
    }

void setField(Field field, Object target, Object value),可以设置 target 对象的 field 属性值,值为 value。

public void getRuleByUtil() {
        try {
            Class clazz=Class.forName("com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager");
            Field circuitBreakers = ReflectionUtils.findField(clazz, "circuitBreakers");
            ReflectionUtils.makeAccessible(circuitBreakers);
            HashMap<String, List<CircuitBreaker>> map= (HashMap<String, List<CircuitBreaker>>) ReflectionUtils.setField(circuitBreakers,clazz,Lists.newArrayList());
            System.out.println(map);
        }catch (ClassNotFoundException e){
            throw new RuntimeException(e);
        }
    }

void makeAccessible(Field field),取消java的权限控制检查,方便private私有访问权限的操作。

对方法的操作

Method findMethod(Class clazz, String name),在类中查找指定名字方法

Method findMethod(Class clazz, String name, Class… paramTypes),有的时候同一个类可能会有多个方法名相同,形参数不同的重载方法,可以使用这个方法更精确的在类中找到指定方法;

Method[] getAllDeclaredMethods(Class leafClass),获得类中所有方法,包括继承而来的。

执行方法

Object invokeMethod(Method method, Object target),执行无参数的方法;

Object invokeMethod(Method method, Object target, Object… args),执行有参数的方法

void makeAccessible(Method method),如果是私有方法,可以取消 Java 权限检查,以便后续执行该私有方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/342648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TX Text Control .NET 31.0 SP1 for WPF 企业版Crack

将文档编辑、创建和 PDF 生成添加到 WPF 应用程序。 TX Text Control for WPF Enterprise 是一个免版税、完全可编程的丰富编辑控件&#xff0c;它在专为 Visual Studio 设计的可重用组件中为开发人员提供了广泛的文字处理功能。它提供全面的文本格式&#xff0c;强大的邮件合并…

golang fmt.Sprintf(“%.2f“) 的舍入问题

首先&#xff0c;fmt.Sprintf("%.2f")使用的是banker rounding 而不是四舍五入&#xff0c;banker rounding 的定义如下&#xff08;来自百度百科&#xff09;&#xff1a;1.要求保留位数的后一位如果是4&#xff0c;则舍去。例如5.214保留两位小数为5.21。2.如果保留…

第四代英特尔至强重磅发布,芯片进入下半场:软硬加速、绿色可持续

编辑 | 宋慧 出品 | CSDN 云计算 2023 年的第二周&#xff0c;英特尔重磅发布其企业级芯片领域重要的产品——第四代英特尔 至强 可扩展处理器。作为数据中心处理器当之无愧的王牌产品&#xff0c;迄今为止&#xff0c;英特尔已经向全球客户交付了超8500万颗​至强可扩展处理器…

agent扩展-自定义外部加载路径

自定义classLoader实现加载外部jar, 以skywalking agent 类加载器为例子 整体思路 扩展findClass &#xff0c;解决loadClass可以查找到扩展findResource&#xff0c;解决getResources可以获取到资源 基本原理 ClassLoader loadClass的加载顺序 findLoadedClass 加载本地已经…

Spring Boot学习篇(十三)

Spring Boot学习篇(十三) shiro安全框架使用篇(五) 1 准备工作 1.1 在SysUserMapper.xml中书写自定义标签 <select id"findRoles" resultType"string">select name from sys_role where id (select roleid from sys_user_role where userid (S…

Matlab论文插图绘制模板第77期—对数刻度横向柱状图

在之前的文章中&#xff0c;分享了Matlab对数刻度柱状图的绘制模板&#xff1a; 进一步&#xff0c;再来看一下对数刻度横向柱状图的绘制模板。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab论文插图绘制模板系列&#xff0c;旨在降低大家使用Matlab进行科研绘…

[WTL/ATL]_[初级]_[TreeView控件如何显示ToolTip]

场景 在开发界面程序时&#xff0c;CTreeViewCtrl(它实际内部封装的就是Win32的TreeView控件)一般会用来作为选择某些类型的树形菜单&#xff0c;点击某项的时候&#xff0c;右边能显示某些对应的数据。当这个控件的宽度固定时&#xff0c;有时候每行的文本项可能由于过长从而…

【图像分类】基于PyTorch搭建LSTM实现MNIST手写数字体识别(双向LSTM,附完整代码和数据集)

写在前面&#xff1a; 首先感谢兄弟们的关注和订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 在https://blog.csdn.net/A…

【CSS】元素居中总结-水平居中、垂直居中、水平垂直居中

【CSS】元素居中一、 水平居中1.行内元素水平居中&#xff08;1&#xff09;text-align2.块级元素水平居中2.1 margin&#xff08;1&#xff09;margin2.2布局&#xff08;1&#xff09;flex justify-content&#xff08;推荐&#xff09;&#xff08;2&#xff09; flexmargin…

张驰咨询:关于六西格玛,有一些常见的疑惑!

​ 很多想要学习六西格玛的学员&#xff0c;经常会有这些困惑&#xff1a; 以前没有接触过六西格玛&#xff0c;需要什么基础吗&#xff1f;自学还是培训&#xff1f;哪些行业会用到六西格玛呢&#xff1f;学习六西格玛对以后的工作有哪些帮助&#xff1f;如何选择六西格玛培…

STM32配置读取双路24位模数转换(24bit ADC)芯片CS1238数据

STM32配置读取双路24位模数转换&#xff08;24bit ADC&#xff09;芯片CS1238数据 CS1238是一款国产双路24位ADC芯片&#xff0c;与CS1238对应的单路24位ADC芯片是CS1237&#xff0c;功能上相当于HX711和TM7711的组合。其功能如下所示&#xff1a; 市面上的模块&#xff1a; …

股票买卖接口怎么来的?

现在股票买卖接口主要是在线上研发&#xff0c;有专业的开发团队进行源码开发和完善&#xff0c;但是&#xff0c;常常会在开发过程中出现问题&#xff0c;也就是遇到一些特殊的情况需要及时处理&#xff0c;那么股票买卖接口怎么开发实现出来的&#xff1f;一、股票买卖接口开…

案例分享| 助力数字化转型:广州期货交易所全栈信创项目管理平台上线

广州期货交易所项目管理平台基于易趋&#xff08;easytrack&#xff09;进行实施&#xff0c;通过近半年的开发及试运行&#xff0c;现已成功交付上线、推广使用&#xff0c;取得了良好的应用效果。1. 关于广州期货交易所&#xff08;以下简称广期所&#xff09;广期所于2021年…

MySQL8.0安装教程

文章目录1.官网下载MySQL2.下载完记住解压的地址&#xff08;一会用到&#xff09;3.进入刚刚解压的文件夹下&#xff0c;创建data和my.ini在根目录下创建一个txt文件&#xff0c;名字叫my&#xff0c;文件后缀为ini&#xff0c;之后复制下面这个代码放在my.ini文件下&#xff…

华为手表开发:WATCH 3 Pro(4)创建项目 + 首页新建按钮,修改初始文本

华为手表开发&#xff1a;WATCH 3 Pro&#xff08;4&#xff09;创建项目 首页新建按钮&#xff0c;修改初始文本初环境与设备创建项目创建项目入口配置项目认识目录结构修改首页初始文本文件名&#xff1a;index.hml新建按钮 “ 按钮 ”index.hml初 鸿蒙可穿戴开发 希望能写…

直播预告 | 对谈谷歌云 DORA 布道师:聊聊最关键的四个 DevOps 表现指标

本期分享 DORA 的全称是 DevOps Research and Assessment&#xff0c;是一个致力于 DevOps 调研与研究的组织&#xff0c;2018 年加入 Google Cloud。自 2014 年起&#xff0c;DORA 每年会发布一份行业报告&#xff0c;基于对数千名从业者的调研&#xff0c;分析高效能团队与低…

联想K14电脑开机全屏变成绿色无法使用怎么U盘重装系统?

联想K14电脑开机全屏变成绿色无法使用怎么U盘重装系统&#xff1f;最近有用户使用联想K14电脑的时候&#xff0c;开机后桌面就变成了绿色的背景显示&#xff0c;无法进行任何的操作。而且通过强制重启之后还是会出现这个问题&#xff0c;那么这个情况如何去进行系统重装呢&…

PMP证书要怎么考,含金量怎么样?

很多朋友在对PMP不是了解的时候&#xff0c;会有些犹豫&#xff0c;PMP证书到底值不值得考。考下来有用吗&#xff1f; PMP证书当然有用&#xff0c;要含金量有含金量&#xff0c;要专业知识有专业知识&#xff0c;不过要是考了不用&#xff0c;久而久之忘了学习的内容&#x…

怿星科技校招礼盒:我想开了

校招礼盒大揭秘为了帮助2023届新同学快速了解怿星文化增强认同感经过1个多月的精心准备我们的校招大礼盒终于跟大家见面啦&#xff01;&#xff01;我们用了大量的公司IP形象-小怿通过各式各样的姿势和表情欢迎新同学的到来搭配着IP的蓝色色调传递出一种科幻与探索的感觉希望加…

计算机组成原理:1. 计算机系统概论

更好的阅读体验\huge{\color{red}{更好的阅读体验}}更好的阅读体验 文章目录1.1 计算机系统简介1.1.1 计算机软硬件概念1.1.2 计算机的层次1.1.3计算机组成和计算机体系结构1.2 计算机的基本组成1.2.1 冯诺伊曼计算机的特点1.2.2 计算机的硬件框图1.2.3 计算机的工作步骤1.3 计…