当前位置:首页 > 科技  > 软件

掌握ReflectionUtils:解锁Java反射的无限可能

来源: 责编: 时间:2024-01-10 09:35:22 322观看
导读前言反射是一种能够在运行时检查或操作程序结构、元数据和行为的特性。这使得程序能够动态地获取关于类、方法、字段等元素的信息,以及在运行时进行相应的操作。获取class对象的三种实现Class<? extends Demo> clazz =

前言

反射是一种能够在运行时检查或操作程序结构、元数据和行为的特性。这使得程序能够动态地获取关于类、方法、字段等元素的信息,以及在运行时进行相应的操作。JFp28资讯网——每日最新资讯28at.com

JFp28资讯网——每日最新资讯28at.com

获取class对象的三种实现JFp28资讯网——每日最新资讯28at.com

  • Class<? extends Demo> clazz = demo.getClass();
  • Class<Demo> clazz = Demo.class;
  • Class clazz = Class.forName("com.demo.Demo");

而在Spring框架中,ReflectionUtils是org.springframework.util包下的一个实用工具类,旨在简化与反射相关的常见任务。它提供了一组方法,使得开发人员能够更方便地执行反射操作,而不必处理过多的样板代码。JFp28资讯网——每日最新资讯28at.com

演示

获取属性字段

/** * 获取属性字段 * 可以指定属性的类型:findField(Class<?> clazz, @Nullable String name, @Nullable Class<?> type)**/public static void findField(){    //查找属性字段name    Field name = ReflectionUtils.findField(Demo.class, "name");    System.out.println(name);}

获取对象的 field 属性值

/*** 获取对象的 field 属性值**/public static void getField() {    Demo demo = new Demo();    demo.setName("一安未来");    demo.setAge(20);    //获取Demo中的name属性字段    Field field = ReflectionUtils.findField(Demo.class, "name");    //取消name属性的private权限控制    ReflectionUtils.makeAccessible(field);    //获取对象的姓名字段的值    Object value = ReflectionUtils.getField(field, demo);    System.out.println(value);}

设置对象的 field 属性值

/** * 设置对象的 field 属性值 **/public static void setField() {    Demo demo = new Demo();    demo.setName("一安未来");    demo.setAge(20);    //获取Demo中的name属性字段    Field field = ReflectionUtils.findField(Demo.class, "name");    //取消name属性的private权限控制    ReflectionUtils.makeAccessible(field);    //设置对象的姓名字段的值    ReflectionUtils.setField(field, demo, "一安未来_v2");    System.out.println(demo.getName());}

对象的值复制

/*** 对象的值复制**/public static void shallowCopyFieldState() {    Demo demo = new Demo();    demo.setName("一安未来");    demo.setAge(20);    Demo demo1 = new Demo();    //把对象demo的值复制到对象demo1上    ReflectionUtils.shallowCopyFieldState(demo, demo1);    System.out.println(demo1);}

对给定类的所有方法执行一个操作

/*** 对给定类的所有方法执行一个操作**/public static void doWithMethods(){    ReflectionUtils.doWithMethods(Demo.class, method -> {        // 处理每个方法        System.out.println("找到方法:" + method.getName());    });}

对给定类的所有字段执行一个操作

/*** 对给定类的所有字段执行一个操作**/public static void doWithFields(){    ReflectionUtils.doWithFields(Demo.class, field -> {        // 处理每个字段        System.out.println("找到字段:" + field.getName());    });}

添加过滤器来选择性的处理方法或字段

/*** 添加过滤器来选择性地处理方法或字段**/public static void doWithMethodsFilter(){    ReflectionUtils.doWithMethods(            Demo.class,            method -> {                // 处理符合条件的方法                System.out.println("找到方法:" + method.getName());            },            method -> {                // 过滤器:选择性处理方法的条件                return method.getName().startsWith("get");            }    );}

调用指定方法

/** * 调用指定方法 **/public static void invokeMethod() throws NoSuchMethodException {    Demo demo = new Demo();    // 获取方法对象    Method method =demo.getClass().getDeclaredMethod("say", String.class);    // 要传递的参数    String [] methodArgs = { "一安未来" };    ReflectionUtils.makeAccessible(method);    ReflectionUtils.invokeMethod(method, demo, methodArgs);}

测试

public static void main(String[] args) throws NoSuchMethodException {    findField();    System.out.println("===============================");    getField();    System.out.println("===============================");    setField();    System.out.println("===============================");    shallowCopyFieldState();    System.out.println("===============================");    doWithMethods();    System.out.println("===============================");    doWithFields();    System.out.println("===============================");    doWithMethodsFilter();    System.out.println("===============================");    invokeMethod();}

输出:JFp28资讯网——每日最新资讯28at.com

private java.lang.String org.yian.reflectionUtils.Demo.name===============================一安未来===============================一安未来_v2===============================Demo(name=一安未来, age=20)===============================找到方法:equals找到方法:toString找到方法:hashCode找到方法:getName找到方法:setName找到方法:say找到方法:getAge找到方法:setAge找到方法:canEqual找到方法:finalize找到方法:wait找到方法:wait找到方法:wait找到方法:equals找到方法:toString找到方法:hashCode找到方法:getClass找到方法:clone找到方法:notify找到方法:notifyAll找到方法:registerNatives===============================找到字段:name找到字段:age===============================找到方法:getName找到方法:getAge找到方法:getClass===============================I'm 一安未来

JFp28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-59653-0.html掌握ReflectionUtils:解锁Java反射的无限可能

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Redis发布订阅,右手就行!

下一篇: 记录一下Python不同数据对象的空值校验!

标签:
  • 热门焦点
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月登场的新机有努比亚Z50S Pro和红魔8S Pro,除了三星之外目前唯二的两款搭载超频版骁龙8Gen2处理器的产品,而且努比亚和红魔也一贯有着不错的性价比,所以在本次的性价比榜单
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java的NIO库提供了内存映射文件的支持,它可以将文件映射到内存中,从而可以更快地读取和写入文件数据。本文将对Java内存映射文件进行详细的介绍和演示。内存映射文件概述内存
  • 一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • iQOO Neo8 Pro真机谍照曝光:天玑9200+和V1+旗舰双芯加持

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
  • 联想YOGA 16s 2022笔记本将要推出,屏幕支持触控功能

    联想此前宣布,将于11月2日19:30召开联想秋季轻薄新品发布会,推出联想 YOGA 16s 2022 笔记本等新品。官方称,YOGA 16s 2022 笔记本将搭载 16 英寸屏幕,并且是一
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
Top