java - 为什么可以通过反射访问私有(private)数据/类?

标签 java

<分区>

在 Java 中,在运行时可以使用反射访问私有(private)字段,也可以使用反射访问私有(private)嵌套/内部类(例如,参见 here)。是否有任何具体的技术原因,或任何一般的设计哲学,可以解释为什么 Java 是这样的?我不知道,但通过阅读 this看起来对于 C#/.NET,至少在某些配置中,同样的事情是不可能的。 Java 也有这种灵 active 吗?是否有任何 JVM 实现不可能做到这一点?

当然,即使 Java 不允许通过反射访问私有(private)字段,您始终可以编写自己的运行时来做任何您喜欢的事情。或者您可以修改二进制 .jar/.class 文件并更改访问修饰符(我认为这是可能的)。

因此,Java 的设计者似乎不得不从三种可能性中进行选择:

  1. 允许直接访问私有(private)字段...可能带有警告。
  2. 不允许直接访问私有(private)字段,但允许使用反射访问私有(private)字段。
  3. 不允许直接访问私有(private)字段,也不允许使用反射访问私有(private)字段。访问私有(private)字段的唯一方法是更改​​运行时或离线修改二进制 .jar/.class 文件。

对我来说,选择中间的那个似乎很武断...如果目标是让它尽可能不方便,那么选择 3 是最好的。如果目标是不给无论如何都无法真正避免的事情增加人为的不便,那么 1 是最好的。

是否有关于语言或运行时的信息通知或强制决定选择选项 2?

最佳答案

从某种意义上说,使用反射不正是您在 #1 中寻找的警告吗?

有时使用反射可以为原本乏味的问题提供一些优雅的解决方案,GSON 库如何创建和填充对象就是一个很好的例子。 “正常”代码不应该访问这些私有(private)字段,使用反射可以让您这样做,并带有所有必要的异常处理和权限修改开销,以明确这不是一般情况下要做的事情。

反射比简单地访问私有(private)字段提供了更多的功能。它允许您在运行时检查有关您在编译时不知道的类和对象的数据,并使用它们来调用方法和访问编译代码时不存在的字段。该行为的一个子集是私有(private)访问。

所以,是的,Java 设计者可以为私有(private)访问创建某种语法,但他们还需要创建反射,这是访问私有(private)数据的更合乎逻辑和更强大的方式;同时非常清楚(如果只是因为它很复杂)应该谨慎使用这种行为。对我来说,简单地调用 object.privates.field 或类似的东西并不意味着相同的严重性。

关于java - 为什么可以通过反射访问私有(private)数据/类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18241487/

相关文章:

java - 是否可以从文本文件中读取多行并将其导出到各自的文本字段?

java - 更改 TextView 中特定单词的颜色

java - JVM自动终止时如何生成线程转储

java - 从现有字符串中提取两个字符串

java - 如何制作带有 Cocoa UI 的 Java 应用程序?

java - @Aspect 与 RMI

java - 使用工厂方法理解像 JDBC 这样的服务提供者框架背后的概念

java - 使用gradle构建错误找不到方法testCompile()

Java - 获取字符串的每个子串的所有排列,子串和排列

java - Web 服务器上的 Zip 文件以解压到本地计算机