一款非常好用的Java反射工具 – ReflectionUtils

一、ReflectionUtils

在 Java 中,反射(Reflection)是一种强大的机制,允许程序在运行时动态地检查类、获取类的信息、调用类的方法、访问或修改类的属性等。Java 的反射机制提供了一组类和接口,位于 java.lang.reflect 包中,通过反射可以动态加载类、动态获取类的信息、动态创建对象、动态调用方法、动态访问和修改属性等。

在 Spring Framework 中也有一个也反射相关的工具类,那就是 ReflectionUtils ,它位于 org.springframework.util 包中,简化 Java 反射操作,提供了以下几个功能:

  • • 遍历类的属性和方法:提供了静态方法 doWithFields() 和 doWithMethods(),允许你遍历一个类的所有属性和方法,并且可以对每个属性和方法执行自定义的操作。

  • • 查找指定名称的属性和方法:提供了方法 findField() 和 findMethod(),用于查找类中指定名称的属性和方法。

  • • 执行方法:提供了方法 invokeMethod(),可以用于执行类中的方法。

  • • 获取和设置属性值:提供了方法 getField() 和 setField(),可以用于获取和设置类的属性值。

  • • 复制属性值:提供了方法 shallowCopyFieldState(),可以用于将源对象的属性值复制到目标对象中。

1. 获取类的属性

public class Test1 {
    private String name;
    private String sex;
    private int age;

    public static void main(String[] args) {

        ReflectionUtils.doWithFields(Test1.class, field -> {
            System.out.println("field name: " + field.getName());
            System.out.println("field type: " + field.getType());
        });

    }

}
一款非常好用的Java反射工具 - ReflectionUtils

2. 获取属性的内容

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Test2 {

    private String name;
    private String sex;
    private int age;

    public static void main(String[] args) {
        Test2 target = new Test2("张三", "男", 21);

        ReflectionUtils.doWithFields(target.getClass(), fieldName ->
                Optional.ofNullable(ReflectionUtils.findField(target.getClass(), fieldName.getName())).ifPresent(field -> {
                    ReflectionUtils.makeAccessible(field);
                    Object value = ReflectionUtils.getField(field, target);
                    System.out.println("fileName: " + fieldName.getName() + " , value: " + value);
                })
        );
    }
}
一款非常好用的Java反射工具 - ReflectionUtils

3. 动态修改属性的值

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Test2 {

    private String name;
    private String sex;
    private int age;

    public static void main(String[] args) {
        Test2 target = new Test2("张三", "男", 21);

        Field field = ReflectionUtils.findField(target.getClass(), "sex");
        assert field == null;
        ReflectionUtils.makeAccessible(field);
        ReflectionUtils.setField(field,target,"女");

        System.out.println(target.toString());
    }
}
一款非常好用的Java反射工具 - ReflectionUtils

4. 动态执行方法

public class Test3 {

    public void t1() {
        System.out.println("this is t1 method ! ");
    }

    public String t2(String param) {
        return "this is t2 method ! param: " + param;
    }

    public static void main(String[] args) {
        Test3 target = new Test3();

        Method t1 = ReflectionUtils.findMethod(target.getClass(), "t1");
        assert t1 != null;
        ReflectionUtils.invokeMethod(t1, target);

        Method t2 = ReflectionUtils.findMethod(target.getClass(), "t2", String.class);
        assert t2 != null;
        String res = (String) ReflectionUtils.invokeMethod(t2, target, "测试");
        System.out.println(res);
    }

}
一款非常好用的Java反射工具 - ReflectionUtils


原文始发于微信公众号(狂热JAVA小毕超):一款非常好用的Java反射工具 – ReflectionUtils

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/241007.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!