2013-09-21 66 views
2

我试图学习反思和我在整个问题,为什么没有例外?为什么没有illegalAccessException使用反射

public class FieldExceptionTest { 
    private boolean b = true; 

    public static void main(String[] args) throws Exception{ 
     FieldExceptionTest ft = new FieldExceptionTest(); 
     Class<?> c = ft.getClass(); 
     Field f = c.getDeclaredField("b"); 
     // f.setAccessible(true); //if i don't write this line, it also can run. 
     f.setBoolean(ft, Boolean.FALSE); 
     System.out.println(ft.b); 
    } 
} 

为什么不抛出IllegalAccessException?通过阅读其他书,我知道如果尝试获取或设置私有或其他不可访问的字段的值或设置最终字段的值,则可能会抛出IllegalAccessException。但在这里,它没有,为什么?

+2

我认为这是因为您的主类在同一个类中。你可以把它放在不同的班级,然后尝试吗? – Avi

回答

3

当访问“可访问的对象”(方法,构造函数,字段等)时,对反射进行访问检查。在这种情况下,您的字段正在从允许访问它的类写入,因此它可以工作。 (另外:这与Java 7方法句柄截然不同,在创建方法句柄时会发生访问检查,而不是在使用时。您可以使用方法句柄为您提供对方法的额外访问有权访问,通过将其传递给通常不具有此类访问权限的其他代码)。

相关问题