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

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

文章目录

一、获取属性核心API

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

java 复制代码
Class.forName("全路径包名") throws ClassNotFoundException // eg com.demo.MyClass 

2 .class的方式

java 复制代码
Class clazz = MyClass.class;

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

java 复制代码
MyClass myClazz = new MyClass();
Class clazz = myClazz.getClass();

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

java 复制代码
Field field = ReflectionUtils.findField(targetClass, name, type); //获取属性对象
ReflectionUtils.makeAccessible(field); //允许操作
ReflectionUtils.setField(field, targetObject, value); //设置值

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

java 复制代码
MyClass myClazz = new MyClass();
ReflectionTestUtils.setField(myClazz,"myField","New Value");

二、测试代码

类环境准备

java 复制代码
public class MyClass{
    private String myField;

    public String getMyField() {
        return myField;
    }

    public void setMyField(String myField) {
        this.myField = myField;
    }
}

方法一设置属性demo

java 复制代码
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();
        }
    }
}

方法二设置属性demo

java 复制代码
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();
        }
    }
}

方法三设置属性demo

java 复制代码
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();
        }
    }
}

方法四获取属性demo

java 复制代码
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();
        }
    }
}

方法五获取属性demo

java 复制代码
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();
        }
    }
}
相关推荐
樱花落木兰17 小时前
Redis 消息队列的可靠性演进:从 List、Pub/Sub 到 Stream 消费者组,以及 8.x 版本改变了什么
java·开发语言·经验分享·redis·分布式·python·软件工程
外收内放17 小时前
ENSP学习记录(6)
开发语言·学习·php
dialect_17 小时前
CODEFORCES ROUND 1127 DIV2
开发语言·c++·算法
盛世宏博北京17 小时前
档案库房恒温恒湿消毒净化一体机与3D可视化平台联动调试笔记
开发语言·php·温湿度·档案室
wtblszn18 小时前
凹版印刷机智慧运维物联网系统方案
java·运维·物联网
Nuanyt18 小时前
LeetCode Hot 100 链表专题(四)· 3 题(Java)
java·算法·leetcode·链表·双指针
zhongben_keji18 小时前
本地生活 APP 开发:城市 × 品类 × 履约形态的三维网格与三套账
java·大数据·生活
code2cat19 小时前
Java工具篇之Maven:从pom.xml到测试通过的JAR
xml·java·maven
wuminyu1 天前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
txxzjmzlh1 天前
SpringBoot 配置⽂件
java·spring boot·spring