IllegalArgumentException:错误消息没有意义

时间:2011-07-14 13:32:02

标签: java reflection

我正在尝试调试依赖于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.,依此类推。

3 个答案:

答案 0 :(得分:5)

从这些访问者的来源看来,声明该字段的类似乎不能从runtimeInstance的类中分配:

  

if(!(this.field.getDeclaringClass()。isAssignableFrom(paramObject.getClass())))      
throwSetIllegalArgumentException(paramObject);

field似乎是您要从实例中获取的字段,paramObject是您的runtimeInstance

因此,如果字段的声明类不是paramObject的类或超类,那么你将得到该消息。

您的paramObjectInteger处是否有机会?

编辑:这里有一些来自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
  • attemptedTypejava.lang.Integer

由于attemptedTyperuntimeInstance的类型,我怀疑classUnderTestDataStructures.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