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