错误:无法将最终的int字段java.lang.Integer.value设置为java.lang.Class

时间:2017-10-06 16:02:06

标签: java

我是java的新手,目前正在练习反思。

我有这段代码:

try {
    Class<?> c = Integer.class;
    System.out.println("Name: " + c.getName());     
    System.out.println("Super Class: " + c.getSuperclass().getName());

    Class[] cl = c.getInterfaces();
    System.out.println("Interfaces list: ");
    for(Class cls: cl)
    {
        System.out.println(cls.getName() + ", ");
    }

    System.out.println("");
    int i = c.getModifiers();
    System.out.println("Access modifiers: " + Modifier.toString(i));

    //-----------
    System.out.println("\nMETHODS");        
    Method[] ms = c.getDeclaredMethods();
    for(Method m: ms)
    {
        System.out.println("Name: "+ m.getName());

    }       

    //------------
    System.out.println("\nFIELDS");
    Field [] flds = c.getDeclaredFields();
    for(Field f: flds)
    {
        System.out.println("Name: "+ f.getName());
        System.out.println("Data type: " + f.getType().getName());
         i = c.getModifiers();
        System.out.println("Acc modifiers: " + Modifier.toString(i));

         f.setAccessible(true); 
         Object value = f.get(c);
         if (value != null) 
         {
            System.out.println(f.getName() + "=" + value);
         }
        System.out.println("--------------");
    }

    }
    catch(Throwable e)
    {
        System.out.println("error: " + e.getMessage());

    }


}

然而,它给出了标题中提到的字段'value'的错误。请解释错误,并告诉我们为什么要写'f.setAccessible(true); '(我在互联网上看到了)它的目的是什么?

1 个答案:

答案 0 :(得分:1)

Field.get(Object obj)的预期参数必须是此字段来自的类的实例。在这种情况下,它必须是Integer的实例,并且您正在使用Class<Integer>的实例,因此会出错。

使用

setAccessible(true)以便即使字段无法访问privateprotected也可以访问该字段。

相关问题