我正在尝试调试一个依赖于反射的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.
等。
从这些访问器的来源来看,声明字段的类似乎不能从runtimeInstance
的类中分配:
如果(! (this.field.getDeclaringClass () .isAssignableFrom (paramObject.getClass ())))
,throwSetIllegalArgumentException (paramObject);
field
似乎是您想要从实例中获得的字段,paramObject
是您的runtimeInstance
。
因此,如果字段的声明类不是paramObject的类或超类,您将得到该消息。
你的paramObject
有可能是Integer
吗?
编辑:这里有一些来自OpenJDK的源代码(应该类似于Oracle的),来解释这个消息:
protected String getSetMessage(String attemptedType, String attemptedValue) {
String err = "Can not set";
if (Modifier.isStatic(field.getModifiers()))
err += " static";
if (isFinal)
err += " final";
err += " " + field.getType().getName() + " field " + getQualifiedFieldName() + " to ";
if (attemptedValue.length() > 0) {
err += "(" + attemptedType + ")" + attemptedValue;
} else {
if (attemptedType.length() > 0)
err += attemptedType;
else
err += "null value";
}
return err;
}
记下你的留言java.lang.IllegalArgumentException: Can not set int field DataStructures.StackAr.topOfStack to java.lang.Integer
我们发现:
- 字段类型为
int
- 字段名是
DataStructures.StackAr
类中的topOfStack
-
attemptedType
isjava.lang.Integer
由于attemptedType
是您的runtimeInstance
的类型,我怀疑classUnderTest
是DataStructures.StackAr
,而runtimeInstance
是java.lang.Integer
的类型。
您在堆栈顶部获得的错误的java源代码似乎表明rununtimeinstance与classUnderTest不是同一个类:
protected void ensureObj(Object o) {
// NOTE: will throw NullPointerException, as specified, if o is null
if (!field.getDeclaringClass().isAssignableFrom(o.getClass())) {
throwSetIllegalArgumentException(o);
}
}
仔细阅读错误信息:"Can not set int字段DataStructures.StackAr.topOfStack to java.lang.Integer"
您需要在分配Integer
之前将其更改为int
。