为什么Java反射API允许我们访问私有和受保护的字段和方法?不';这难道不违背访问修饰符的目的吗?

为什么Java反射API允许我们访问私有和受保护的字段和方法?不';这难道不违背访问修饰符的目的吗?,java,reflection,access-modifiers,Java,Reflection,Access Modifiers,我们可以通过Java反射API访问私有变量。那么,拥有访问修饰符有什么用呢?还可以帮助我更好地了解访问修饰符(private、public等)在实际应用程序中的实际使用情况。它仍然可以防止开发人员错误地使用私有变量。如果有人使用反射来访问私有变量,他(满怀希望地)知道自己在做什么 另外,大多数框架不会直接访问变量,而是会查找变量的getter和setter。通过反射“访问私有”字段在很长一段时间内都不受支持,最终它将消失。在最新的java版本中,当您尝试以反射方式(如private和protec

我们可以通过Java反射API访问私有变量。那么,拥有访问修饰符有什么用呢?还可以帮助我更好地了解访问修饰符(private、public等)在实际应用程序中的实际使用情况。

它仍然可以防止开发人员错误地使用私有变量。如果有人使用反射来访问私有变量,他(满怀希望地)知道自己在做什么

另外,大多数框架不会直接访问变量,而是会查找变量的getter和setter。

通过反射“访问私有”字段在很长一段时间内都不受支持,最终它将消失。在最新的java版本中,当您尝试以反射方式(如
private
protected
)访问内容时,已经收到警告。在未来的版本中,这可能会完全消失。通过project
jigsaw
,JVM在每个版本中越来越受到封装和限制

java
中较新的API,如
MethodHandles
,如果您不在适当的范围内,则可以通过
privateLookupIn
创建/访问
private
成员的API将失败。简单地说,您可以访问某些代码的私有成员,比如在允许/公开此类访问的
模块中,但不是在任何地方。在某种程度上,这是一个限制性更强的API,而不是
反射
。因此,阻止这种使用的工作正在进行中,通过精心编制的新API


至于反射被库使用的论点,这是正确的。但一个好的图书馆很少需要私人访问
Spring
,这是最著名的,它不需要这些信息。它只需要
公共
数据(如
公共
的方法)和
注释
等。

反射不用于一般开发,它有非常具体的用例,例如用于编写工具和框架。访问修饰符有助于组织代码,例如隐藏实现细节,减少公共API的暴露区域。我认为您也可以使用SecurityManager关闭此功能。