我正在尝试学习反思,而我在整个问题上,为什么没有异常?
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?通过阅读其他书籍,我知道如果尝试获取或设置私有或其他不可访问字段的值或设置最终字段的值,则可能抛出An IllegalAccessException。但在这里,它不是,为什么?
答案 0 :(得分:3)
访问“访问对象”(方法,构造函数,字段等)时发生反射检查。在这种情况下,您的字段是从允许访问它的类中写入的,因此它可以正常工作。
(顺便说一句:这与Java 7方法句柄截然不同,其中访问检查在创建方法句柄时发生,而不是在使用它时。您可以使用方法句柄授予对您拥有的方法的额外访问权限通过将其传递给通常不具有此类访问权限的其他代码来访问。)