IllegalArgumentException:错误消息没有意义

Tia*_*oso 3 java 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)
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.等等的字符串中删除一些伪像。

Tho*_*mas 5

从这些访问器的来源来看,声明字段的类似乎不能从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我们发现:

  • 该字段是类型 int
  • 该字段的名称topOfStack在课堂上DataStructures.StackAr
  • attemptedTypejava.lang.Integer

因为我怀疑attemptedType您的类型是, 而您的类型是。runtimeInstanceclassUnderTestDataStructures.StackArruntimeInstancejava.lang.Integer