我正在尝试调试依赖于Reflection的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.
,依此类推。
答案 0 :(得分:5)
从这些访问者的来源看来,声明该字段的类似乎不能从runtimeInstance
的类中分配:
if(!(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
topOfStack
DataStructures.StackAr
attemptedType
是java.lang.Integer
由于attemptedType
是runtimeInstance
的类型,我怀疑classUnderTest
是DataStructures.StackAr
,而runtimeInstance
的类型是java.lang.Integer
。
答案 1 :(得分:1)
你在堆栈顶部得到的错误的java源代码似乎表明runtimeInstance与classUnderTest不是同一个类:
protected void ensureObj(Object o) {
// NOTE: will throw NullPointerException, as specified, if o is null
if (!field.getDeclaringClass().isAssignableFrom(o.getClass())) {
throwSetIllegalArgumentException(o);
}
}
答案 2 :(得分:0)
仔细阅读错误消息:“无法将 int 字段DataStructures.StackAr.topOfStack设置为java.lang。整数”
在分配之前,您需要将Integer
更改为int
。