Java 通过反射修改基本数据类型
我目前正在(独立地)研究反射,我正在使用Field类,并且我已经找到了如何获取声明变量的名称和值;但是,我希望通过正在实例化的字段对象修改变量。 这是我的密码:Java 通过反射修改基本数据类型,java,variables,reflection,field,primitive,Java,Variables,Reflection,Field,Primitive,我目前正在(独立地)研究反射,我正在使用Field类,并且我已经找到了如何获取声明变量的名称和值;但是,我希望通过正在实例化的字段对象修改变量。 这是我的密码: public void handleOutput() { try { Field f = getClass().getDeclaredField("test"); f.setInt(int.class, 1); System.out.println(f.getName()+": "
public void handleOutput() {
try {
Field f = getClass().getDeclaredField("test");
f.setInt(int.class, 1);
System.out.println(f.getName()+": "+f.get(this));
System.out.println("test: "+test);
} catch (IllegalAccessException | NoSuchFieldException e) {
e.printStackTrace();
}
}
通过此方法,尽管正在抛出IllegalArgumentException:
Exception in thread "main" java.lang.IllegalArgumentException: Can not set int f
ield Main.test到java.lang.Class
在sun.reflect.UnsafeFieldAccessorImpl.throwsetilegalargumentException处(
(未知来源)
在sun.reflect.UnsafeFieldAccessorImpl.throwsetilegalargumentException处(
(未知来源)
在sun.reflect.UnsafeFieldAccessorImpl.ensureObj(未知源)
在sun.reflect.UnsafeIntegerFieldAccessorImpl.setInt处(未知源)
位于java.lang.reflect.Field.setInt(未知源)
在Main.handleOutput(Main.java:13)
Main.Main(Main.java:28)
按任意键继续
我如何使用声明的字段修改原始int数据类型测试的值?您的意思是
f.setInt(this, 1);
你读过javadoc吗?
Field#将
期望的第一个参数设置为什么?哇,这太尴尬了。在这个场景中,我对this关键字的整个用法有点困惑,您能解释一下这行代码为什么有效吗?@Dan字段
是类
的属性,而不是实例的属性。为了对特定实例进行更改,您需要将要执行操作的实例传递到方法中。在本例中,该实例与this
相同,因此这就是您传入的内容。