我正在学习反思。当我执行以下代码时:
package main;
import java.lang.reflect.Field;
public class Main {
public static void main(String[] args) throws NoSuchFieldException, SecurityException {
Base firstBase = new Base();
Field firstBaseField = firstBase.getClass().getDeclaredField("protectedBuffer");
System.out.println(firstBaseField.isAccessible());
}
}
这是基类:
package main;
public class Base {
private StringBuffer buffer;
protected StringBuffer protectedBuffer;
public StringBuffer buffer2;
}
结果是错误的。但shoudn't它是真实的,因为我可以访问protectedBuffer
以这样的方式firstBase.protectedBuffer
?
那是因为您没有在测试时是否测试Field protectedBuffer
是否可访问firstBaseField.isAccessible();
这里发生的是您检查其中的值AccessibleObject
是Field的基类。此标志不会告诉您java访问修饰符是否可以访问该字段,它可以告诉您当前是否忽略了这些修饰符。
当您firstBaseField.isAccessible()
对它的判断不正确时,仅表示Java访问规则仍然存在,并且不会被反射机制覆盖。
setAccessible()
将此对象的可访问标志设置为指示的布尔值。值为true表示反射对象在使用时应禁止Java语言访问检查。值为false表示所反射的对象应强制执行Java语言访问检查。
编辑
要测试java访问修饰符是否可以访问该字段,您可以尝试访问它并catch IllegalAccessException
,例如下面的示例。
Field field = instance.getClass().getDeclaredField("someField");
// IllegalAccessException
field.get(instance);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句