Java反射API为何允许我们访问私有和受保护的字段和方法?这是否违背了访问修饰符的作用?

4
我们可以通过Java反射API访问私有变量。那么,有访问修饰符还有什么用呢?同时,帮助我更好地理解在实际应用中访问修饰符(private、public等)的真正用途。

6
反射不用于一般的开发,它有非常具体的用例,例如用于编写工具和框架。访问修饰符用于帮助组织代码,例如隐藏实现细节,减少公共 API 的公开范围。 - Gavin
1
我认为你也可以通过SecurityManager关闭它。 - Thilo
2个回答

1
它仍然可以防止开发人员错误使用私有变量。如果有人使用反射来访问私有变量,他(希望)知道自己在做什么。
此外,大多数框架不会直接访问变量,而是会寻找变量的getter和setter。

0

通过反射访问“私有”字段的功能将不会得到长时间支持,最终它将消失。在大多数最新的Java版本中,当您尝试以反射方式(如privateprotected)访问内容时,您已经会收到警告。在未来的版本中,这可能会完全消失。通过项目jigsaw,每个版本中的JVM变得越来越封装和受限。

而且,在java中的新API,例如MethodHandles,可以通过privateLookupIn创建/访问private成员,如果您不在适当的范围内,则会失败。简单地说 - 您可以访问某些代码的私有成员,例如允许/公开此类访问的module,但不是在任何地方。从某种意义上说,这是一个比reflection更为严格的API。因此,通过精心制作的新API来阻止此类用法正在进行中。

关于反射被库使用的论点 - 这是正确的。但很少有好的库需要私有访问。最著名的 Spring 就不需要那些信息。它只需要 public class 数据(例如公共方法、注释等)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接