【发布时间】:2011-07-14 13:32:01
【问题描述】:
我正在尝试调试依赖反射的 Java 应用程序。现在我得到的错误如下:
java.lang.IllegalArgumentException: Can not set int field DataStructures.StackAr.topOfStack to java.lang.Integer
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37)
at sun.reflect.UnsafeIntegerFieldAccessorImpl.getInt(UnsafeIntegerFieldAccessorImpl.java:38)
at sun.reflect.UnsafeIntegerFieldAccessorImpl.get(UnsafeIntegerFieldAccessorImpl.java:18)
at java.lang.reflect.Field.get(Field.java:358)
应用程序运行的最后几行是:
Field f = classUnderTest.getDeclaredField(processFieldName(var));
f.setAccessible(true);
Long value = (Long) f.get(runtimeInstance);
错误消息有点误导,我不确定为什么它提到set 操作,而我正在尝试执行get。
我怀疑runtimeInstance 不是预期类的对象。但是那个错误消息让我失望了。
以前有人遇到过这个问题吗?有什么线索吗?
PS1:导致异常的确切行是这一行:
Long value = (Long) f.get(runtimeInstance);
PS2:processFieldName(var) 处理字段的正确名称,即它从字段名称为 this. 等的字符串中删除一些伪像。
【问题讨论】:
-
这可能是一个自动装箱问题,即
int自动被Integer包裹。 -
(1) 检查究竟是哪一行产生了错误。你写了3行。 (2) processFieldName(var) 返回什么? (3)它与classUnderTest中的字段如何对应?
-
到底是什么样的字段?
-
我同意你对 runtimeInstance 的怀疑。你为什么不测试一下?
-
试过在eclipse上使用调试器吗?
标签: java reflection