【Java学习记录05】Java通过反射修改成员变量的值

Java通过反射修改成员变量的值

  • 关于反射中的Field类的详细介绍请看这里

本篇重点在于记录一些使用上的一些小问题

下面的例子是通过反射在运行时改变TestMapReflect类中的map属性值。

//TestMapReflect.java
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class TestMapReflect {
    public  Map<String, Integer> map = new HashMap<>();
    public static void main(String[] args) {
        TestMapReflect testMapReflect = new TestMapReflect();
        testMapReflect.map.put("Main", 1);
        try {
            //获取Class对象
            Class clz =  Class.forName("TestMapReflect");
            //获取map属性
            Field mapFiled = clz.getDeclaredField("map");
            //设置可修改
            mapFiled.setAccessible(true);
            //创建新的map
            Map<String,Integer> newMap = new HashMap<>();
            newMap.put("ReflectMain", 2);
            //set方法设置map属性为新创建的newMap
            mapFiled.set(testMapReflect,newMap);
        } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
        System.out.println("in TestMapReflect "+ testMapReflect.map);
    }
}

整个过程中规中矩,就是新创建一个Map对象,通过set方法(Map为引用数据类型)将原属性值替换掉。

运行结果:
在这里插入图片描述

  • 问题:是否可以创建匿名对象来替换掉原属性值?

    下面来验证:

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class TestMapReflect {
    public  Map<String, Integer> map = new HashMap<>();
    public static void main(String[] args) {
        TestMapReflect testMapReflect = new TestMapReflect();
        testMapReflect.map.put("Main", 1);
        try {
            //获取Class对象
            Class clz =  Class.forName("TestMapReflect");
            //获取map属性
            Field mapFiled = clz.getDeclaredField("map");
            //设置可修改
            mapFiled.setAccessible(true);
            //创建新的map
//            Map<String,Integer> newMap = new HashMap<>();
//            newMap.put("ReflectMain", 2);
            //set方法设置map属性为新创建的newMap
//            mapFiled.set(testMapReflect,newMap);
            mapFiled.set(testMapReflect,new HashMap<String, Integer>().put("ReflectMain", 2));
        } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
        System.out.println("in TestMapReflect "+ testMapReflect.map);
    }
}

运行结果:
在这里插入图片描述
说明:考虑是匿名对象调用了put方法后,再无对象引用它,所以垃圾回收机制将它回收了,所以set方法拿到的值为null。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值