【问题标题】:Modifying primitive data types through reflection通过反射修改原始数据类型
【发布时间】:2014-10-11 21:45:28
【问题描述】:

我目前正在研究反射(独立),我正在使用 Field 类,并且我已经弄清楚如何获取已声明变量的名称和值;但是,我希望通过我正在实例化的 Field 对象来修改变量。 这是我的代码:

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

将 Main.test 转换为 java.lang.Class 在 sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException( 来源不明) 在 sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException( 来源不明) 在 sun.reflect.UnsafeFieldAccessorImpl.ensureObj(未知来源) 在 sun.reflect.UnsafeIntegerFieldAccessorImpl.setInt(未知来源) 在 java.lang.reflect.Field.setInt(未知来源) 在 Main.handleOutput(Main.java:13) 在 Main.main(Main.java:28) 按任意键继续 。 . .

如何使用声明的字段修改原始 int 数据类型测试的值?

【问题讨论】:

  • 你读过javadoc吗? Field#set 的第一个参数是什么?

标签: java variables reflection field primitive


【解决方案1】:

看来你的意思

f.setInt(this, 1);

【讨论】:

  • 哇,太尴尬了。我对这个场景中 this 关键字的整个用法有点困惑,你能解释一下为什么这行代码有效吗?
  • @Dan FieldClass 的属性,而不是实例的属性。为了对特定实例进行更改,您需要将要操作的实例传递给方法。在这种情况下,该实例与 this 相同,所以这就是您传入的内容。
猜你喜欢
  • 2012-07-20
  • 2018-08-19
  • 1970-01-01
  • 2019-01-08
  • 2020-12-14
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
相关资源
最近更新 更多