2

我试图学习反思,但我提出了一个问题,为什么没有例外?

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。但是在这里,它没有,为什么?

4

1 回答 1

3

当访问“可访问对象”(方法、构造函数、字段等)时,会进行反射访问检查。在这种情况下,您的字段是从允许访问它的类写入的,因此它可以工作。

(顺便说一句:这与 Java 7 方法句柄明显不同,后者在创建方法句柄时进行访问检查,而不是在使用它时进行。您可以使用方法句柄来授予对您有权访问的方法的额外访问权限,通过将其传递给通常不具有此类访问权限的其他代码。)

于 2013-09-21T01:30:18.667 回答