如上所述here:
“可访问性是一个静态属性,可以在编译时确定;它只取决于类型和声明修饰符。”
在这种情况下,java.lang.reflect.Field.setAccessible(boolean)
函数在运行时中的作用是什么?
答案 0 :(得分:3)
setAccessible
不会改变成员的可访问性级别。它只允许通过单独的反射访问某个成员。这并没有明确地破坏可访问性规则,因为你的代码并没有真正访问成员:它调用一个反射方法,在内部做一些魔法,代表你访问该成员。
考虑到这一点,还有一个关键点需要注意:Java还有一个非常强大且无法访问的安全系统,可以拒绝对外部代码使用反射。无论何时需要,此机制都可用于真正阻止访问私有成员。
答案 1 :(得分:1)
我允许您使用反射更改对象的可访问性,就像您期望的那样。来自班级AccessibleObject
的{{3}}:
在反射对象中设置可访问标志允许具有足够权限的复杂应用程序(例如Java对象序列化或其他持久性机制)以通常禁止的方式操作对象。
答案 2 :(得分:1)
您的引用不适用于反射API。 JLS #1.4明确声明您可以通过未经JLS明确授权的反射操作来实现:
因此,本说明书没有详细描述反射。许多语言结构在反射API中都有类似物,但这些通常不在这里讨论。因此,例如,当我们列出可以创建对象的方式时,我们通常不会包括反射API可以实现此目的的方式。读者应该了解这些额外的机制,即使它们在本文中没有提到。