为啥 Java 反射 API 允许我们访问私有和受保护的字段和方法?这不会破坏访问修饰符的目的吗? [复制]
Posted
技术标签:
【中文标题】为啥 Java 反射 API 允许我们访问私有和受保护的字段和方法?这不会破坏访问修饰符的目的吗? [复制]【英文标题】:Why does the Java reflection API allow us to access private and protected fields and methods? Doesn't this break the purpose of access modifiers? [duplicate]为什么 Java 反射 API 允许我们访问私有和受保护的字段和方法?这不会破坏访问修饰符的目的吗? [复制] 【发布时间】:2021-05-28 16:17:42 【问题描述】:我们可以通过 Java 反射 API 访问私有变量。那么拥有访问修饰符有什么用呢?还可以帮助我更好地了解访问修饰符(私有、公共等)在实际应用程序中的实际用法。
【问题讨论】:
反射不用于一般开发,它有非常具体的用例,例如用于编写工具和框架。访问修饰符有助于组织代码,例如隐藏实现细节,减少 public API 的暴露区域。 我认为您也可以使用 SecurityManager 将其关闭。 【参考方案1】:它仍然保护私有变量不被开发人员错误地使用。如果有人使用反射来访问私有变量,他(希望)知道他在做什么。
此外,大多数框架不会直接访问变量,而是会查找变量的 getter 和 setter。
【讨论】:
【参考方案2】:通过反射“访问私有”字段在很长一段时间内不会得到支持,最终它会消失。对于最新的 Java 版本,当您尝试以反射方式访问事物时(例如 private
和 protected
),您已经收到警告。在未来的版本中,这可能会完全消失。通过项目jigsaw
,JVM
在每个版本中变得越来越封装和限制。
如果您不在适当的范围内,java
中较新的 API(如 MethodHandles
)可以通过 privateLookupIn
创建/访问 private
成员将失败。用更简单的话说 - 您可以访问某些代码的私有成员,例如在允许/公开此类访问的module
中,但并非无处不在。在某种程度上,这是一个限制性更强的 API,而不是 reflection
。因此,通过适当设计的较新 API,阻止此类使用的工作正在进行中。
关于库使用反射的论点 - 这是真的。但很少有好的图书馆需要私人访问。 Spring
,这是最著名的 - 不需要该信息。它只需要public
class
数据(如public
的方法),annotations
等。
【讨论】:
以上是关于为啥 Java 反射 API 允许我们访问私有和受保护的字段和方法?这不会破坏访问修饰符的目的吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何限制开发人员使用反射访问Java中的私有方法和构造函数?