掌握ReflectionUtils:解锁Java反射的无限可能
创始人
2025-07-10 19:31:06
0

前言

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

获取class对象的三种实现

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

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

演示

获取属性字段

/**
 * 获取属性字段
 * 可以指定属性的类型: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();
}

输出:

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 一安未来

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...