我是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); '(我在互联网上看到了)它的目的是什么?
答案 0 :(得分:1)
Field.get(Object obj)
的预期参数必须是此字段来自的类的实例。在这种情况下,它必须是Integer
的实例,并且您正在使用Class<Integer>
的实例,因此会出错。
setAccessible(true)
以便即使字段无法访问private
或protected
也可以访问该字段。