• 【Java】利用反射设置属性对象


    【Java】利用反射设置属性对象

    一、获取属性核心API

    1 使用Class.forName设置类中属性

    Class.forName("全路径包名") throws ClassNotFoundException // eg com.demo.MyClass 
    
    • 1

    2 .class的方式

    Class clazz = MyClass.class;
    
    • 1

    3 使用类对象的 getClass() 方法

    MyClass myClazz = new MyClass();
    Class clazz = myClazz.getClass();
    
    • 1
    • 2

    4 ReflectionUtils获取属性,允许操作,设置值

    Field field = ReflectionUtils.findField(targetClass, name, type); //获取属性对象
    ReflectionUtils.makeAccessible(field); //允许操作
    ReflectionUtils.setField(field, targetObject, value); //设置值
    
    • 1
    • 2
    • 3

    5 ReflectionTestUtils直接操作属性,内部封装了ReflectionUtils的api

    MyClass myClazz = new MyClass();
    ReflectionTestUtils.setField(myClazz,"myField","New Value");
    
    • 1
    • 2

    二、测试代码

    类环境准备

    public class MyClass{
        private String myField;
    
        public String getMyField() {
            return myField;
        }
    
        public void setMyField(String myField) {
            this.myField = myField;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    方法一设置属性demo

    import java.lang.reflect.Field;
    
    public class ReflectExample {
        public static void main(String[] args) {
            try {
                // 使用 Class.forName 获取类对象 todo 替换掉xxx.MyClass的路径
                Class<?> myClass = Class.forName("xxxx.MyClass");
    
                // 创建类的实例
                Object myInstance = myClass.newInstance();
    
                // 获取类的属性 Field 对象
                Field myField = myClass.getDeclaredField("myField");
    
                // 设置属性的访问权限,因为 myField 可能是私有的
                myField.setAccessible(true);
    
                // 设置属性的值
                myField.set(myInstance, "New Value");
    
                // 打印结果
                System.out.println("New value of myField: " + myField.get(myInstance));
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    方法二设置属性demo

    import java.lang.reflect.Field;
    
    public class ReflectExample {
        public static void main(String[] args) {
            try {
                // 使用MyClass.class获取类对象
                Class<?> myClass  = MyClass.class;
    
                // 创建类的实例
                Object myInstance = myClass.newInstance();
    
                // 获取类的属性 Field 对象
                Field myField = myClass.getDeclaredField("myField");
    
                // 设置属性的访问权限,因为 myField 可能是私有的
                myField.setAccessible(true);
    
                // 设置属性的值
                myField.set(myInstance, "New Value");
    
                // 打印结果
                System.out.println("New value of myField: " + myField.get(myInstance));
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    方法三设置属性demo

    import java.lang.reflect.Field;
    
    public class ReflectExample {
        public static void main(String[] args) {
            try {
                // 创建对象
                MyClass myClazz = new MyClass();
    
                // 使用对象.getClass(),获取类对象
                Class<?> myClass  = myClazz.getClass();
    
                // 创建类的实例
                Object myInstance = myClass.newInstance();
    
                // 获取类的属性 Field 对象
                Field myField = myClass.getDeclaredField("myField");
    
                // 设置属性的访问权限,因为 myField 可能是私有的
                myField.setAccessible(true);
    
                // 设置属性的值
                myField.set(myInstance, "New Value");
    
                // 打印结果
                System.out.println("New value of myField: " + myField.get(myInstance));
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    方法四获取属性demo

    import org.springframework.util.ReflectionUtils;
    import java.lang.reflect.Field;
    
    public class ReflectExample {
        public static void main(String[] args) {
            try {
                // 创建对象
                MyClass myClazz = new MyClass();
                Field myField = ReflectionUtils.findField(MyClass.class, "myField", String.class);
                ReflectionUtils.makeAccessible(myField);
                ReflectionUtils.setField(myField, myClazz, "New Value");
                // 打印结果
                System.out.println("New value of myField: " + myClazz.getMyField());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    方法五获取属性demo

    import org.springframework.test.util.ReflectionTestUtils;
    
    public class ReflectExample {
        public static void main(String[] args) {
            try {
                // 创建对象
                MyClass myClazz = new MyClass();
                ReflectionTestUtils.setField(myClazz, "myField", "New Value");
                // 打印结果
                System.out.println("New value of myField: " + myClazz.getMyField());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    WPF Binding对象、数据校验、数据转换
    java毕业生设计医院药品管理系统计算机源码+系统+mysql+调试部署+lw
    Service Worker cache 相比 HTTP cache 的一些优点
    阿里巴巴面试题- - -Java体系最新面试题(3)
    数字通信和fpga概述——杜勇版本学习笔记
    【Python】Locust持续优化:InfluxDB与Grafana实现数据持久化与可视化分析
    OpenAI 董事会宫斗始作俑者?一窥伊尔亚·苏茨克维内心世界
    (二)ndarray(Python)与Mat(C++)数据的传输
    List集合详细讲解
    曼哈顿距离和切比雪夫距离的转换
  • 原文地址:https://blog.csdn.net/qq_37192800/article/details/133986053