- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在学习反射(reflection)。当我执行以下代码时:
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;
}
结果是假的。但这不应该是真的吗,因为我可以通过这种方式访问 protectedBuffer
:firstBase.protectedBuffer
?
最佳答案
那是因为当您执行 firstBaseField.isAccessible();
protectedBuffer
是否可访问
这里发生的是您检查 AccessibleObject
的值,它是 Field 的基类。此标志不会告诉您字段是否可通过 java 访问修饰符访问,它会告诉您这些修饰符当前是否被忽略。
当您在 firstBaseField.isAccessible()
上得到 false 时,这仅仅意味着 java 访问规则仍然存在并且没有被反射机制覆盖。
setAccessible()
Set the accessible flag for this object to the indicated boolean value. A value of true indicates that the reflected object should suppress Java language access checking when it is used. A value of false indicates that the reflected object should enforce Java language access checks.
编辑
要测试该字段是否可以通过 java 访问修饰符访问,您可以尝试访问它并捕获 IllegalAccessException
,如下例所示。
Field field = instance.getClass().getDeclaredField("someField");
// IllegalAccessException
field.get(instance);
关于Java反射isAccessible方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32024118/
我正在使用 PODAM用一些 JUnit 测试用例中的一些测试数据填充我的对象。我遇到了一个我无法理解的错误。 PODAM 在制造我的对象时报告了这行日志记录: The setter: setId i
我是一名优秀的程序员,十分优秀!