我正在尝试调试依赖反射的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)
Run Code Online (Sandbox Code Playgroud)
正在运行的应用程序的最后几行是:
Field f = classUnderTest.getDeclaredField(processFieldName(var));
f.setAccessible(true);
Long value = (Long) f.get(runtimeInstance);
Run Code Online (Sandbox Code Playgroud)
错误消息有点令人误解,我不确定为什么它在提及要set执行的操作时却提到了操作get。
我怀疑runtimeInstance并非预期类别的对象。但是,该错误消息使我不知所措。
有人遇到过这个问题吗?有什么线索吗?
PS1:导致异常的确切行是此行:
Long value = (Long) f.get(runtimeInstance);
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
收到您的消息,java.lang.IllegalArgumentException: Can not set int field DataStructures.StackAr.topOfStack to java.lang.Integer我们发现:
inttopOfStack在课堂上DataStructures.StackArattemptedType 是 java.lang.Integer 因为我怀疑attemptedType您的类型是, 而您的类型是。runtimeInstanceclassUnderTestDataStructures.StackArruntimeInstancejava.lang.Integer
| 归档时间: |
|
| 查看次数: |
6705 次 |
| 最近记录: |