在 Java 中,在运行时可以使用反射访问私有字段,也可以使用反射访问私有嵌套/内部类(例如,请参见此处)。是否有任何特定的技术原因或任何一般的设计理念可以解释为什么 Java 会这样?我不知道,但从阅读这篇文章来看,它看起来像 C#/.NET,至少在某些配置中,同样的事情是不可能的。Java是否也具有这种灵活性?是否有任何 JVM 实现无法做到这一点?
当然,即使 Java 不允许通过反射访问私有字段,您也可以随时编写自己的运行时来做任何您喜欢的事情。或者您可以修改二进制 .jar/.class 文件并更改访问修饰符(我认为这是可能的)。
因此,Java 的设计者似乎必须从三种可能性中进行选择:
- 允许直接访问私有字段...可能带有警告。
- 不允许直接访问私有字段,但允许使用反射访问私有字段。
- 不允许直接访问私有字段,也不允许使用反射访问私有字段。访问私有字段的唯一方法是更改运行时或离线修改二进制 .jar/.class 文件。
选择中间的对我来说似乎是任意的……如果目标是让它尽可能不方便,选择 3 是最好的。如果目标是不给无论如何都无法真正预防的事情增加人为的不便,那么 1 是最好的。
是否有关于语言或运行时的某些信息通知或强制决定采取选择 2?