为啥 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 版本,当您尝试以反射方式访问事物时(例如 privateprotected),您已经收到警告。在未来的版本中,这可能会完全消失。通过项目jigsawJVM 在每个版本中变得越来越封装和限制。

如果您不在适当的范围内,java 中较新的 API(如 MethodHandles)可以通过 privateLookupIn 创建/访问 private 成员将失败。用更简单的话说 - 您可以访问某些代码的私有成员,例如在允许/公开此类访问的module 中,但并非无处不在。在某种程度上,这是一个限制性更强的 API,而不是 reflection。因此,通过适当设计的较新 API,阻止此类使用的工作正在进行中。

关于库使用反射的论点 - 这是真的。但很少有好的图书馆需要私人访问。 Spring,这是最著名的 - 不需要该信息。它只需要publicclass数据(如public的方法),annotations等。

【讨论】:

以上是关于为啥 Java 反射 API 允许我们访问私有和受保护的字段和方法?这不会破坏访问修饰符的目的吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何禁止公共继承但允许私有(和受保护)继承

为啥Java反射在另一个包中找不到一个类的包私有构造函数?

为啥Java不允许我通过同一个类的方法访问私有方法?

如何限制开发人员使用反射访问Java中的私有方法和构造函数?

Objective-c:为啥在使用 KVC 时私有 ivars 不被外部访问隐藏

java反射访问私有方法的的问题