Java反射设置和访问私有属性值

越学习到后面,越感觉java反射机制很重要,必须精通,要不框架那块比较难自己动手实现,回过头温习一下反射机制,查漏补缺

今天尝试了一下通过反射访问和设置类的私有属性(不设置settesr和getters),比较容易理解,代码一贴就知道了

下面是po代码:

package cn.liangqinghai.reflect;

public class Beans1 {
    public Beans1(){
        System.out.println("无参构造调用");
    }
    public Beans1(String name){
        System.out.println("带参数构造函数"+name);
    }
    public String getName(){
        return "getName返回值";
    }
    /**
     * 设置私有属性,并没有设置setters和getters
     */
    private String userName = "username";
    private String adminName = "adminName";
}

下面是测试类:

/**
     * 测试反射访问属性
     */
    @Test
    public void testFields() {

        try {
            Class<?> clazz = Class.forName("cn.liangqinghai.reflect.Beans1");

            //
            Beans1 bean = (Beans1) clazz.newInstance();

            Field[] fs = clazz.getDeclaredFields();

            for (Field field : fs) {
                // 要设置属性可达,不然会抛出IllegalAccessException异常
                field.setAccessible(true);

                // 打印初始值
                System.out.println("设置属性之前:" + field.getName() + "===" + field.get(bean));

                // 设置属性值,set(Object obj, Object value)
                // obj - 应该修改其字段的对象
                // value - 正被修改的 obj 的字段的新值(参考api)
                field.set(bean, "Liang");
                // 打印设置属性之后的值
                System.out.println("设置属性之后:" + field.getName() + "=" + field.get(bean));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

最终执行结果:

无参构造调用
设置属性之前:userName===username
设置属性之后:userName=Liang
设置属性之前:adminName===adminName
设置属性之后:adminName=Liang
总结:通过反射机制获取和设置类的私有属性就这样,
注意点:
1、属性Field要设置.setAccessible(true),不然会报IllegalAccessException异常
2、Field.set(obj,value)中,第一个参数是当前对象(参考代码中的bean实例引用)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的反射机制可以通过调用Class类的getDeclaredField(String name)方法来获取私有属性的Field对象,并通过调用Field对象的setAccessible(true)方法来设置私有属性的可访问性。然后,可以通过调用Field对象的get(Object obj)方法来获取私有属性。 具体步骤如下: 1. 首先,通过Class类的forName(String className)方法获取要反射的类的Class对象。 2. 接下来,使用Class对象的getDeclaredField(String name)方法获取指定名称的私有属性的Field对象。 3. 在获取Field对象后,调用Field对象的setAccessible(true)方法设置私有属性的可访问性。 4. 最后,通过调用Field对象的get(Object obj)方法获取私有属性。 下面是一个示例代码: ```java public class ReflectExample { private String privateField = "私有属性"; public static void main(String[] args) throws Exception { Class<ReflectExample> reflectClass = ReflectExample.class; Field privateField = reflectClass.getDeclaredField("privateField"); privateField.setAccessible(true); ReflectExample reflectExample = new ReflectExample(); String value = (String) privateField.get(reflectExample); System.out.println("私有属性为:" + value); } } ``` 运行以上代码,输出结果为:"私有属性"。 反射机制很强大,可以通过获取私有属性的Field对象来获得和设置私有属性,但使用反射机制可能会降低代码的可读性和性能,所以在实际开发中要谨慎使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值