Private是Private,那么为什么java提供使用反射访问私有方法的工具?

Kun*_*ish 9 java reflection

使用反射时需要注意哪些潜在问题.我在反思中非常困惑,为什么java提供这种类型的功能来访问私有数据成员.

私有: 就像我想的那样,只有声明它的类才能看到它.

那为什么有可能访问其他类的私人事物?这个术语(反射)完全溢出了我在java中的private(Access Specifier)属性的概念.

我访问了许多有关此主题的链接,但没有给出关于此主题的完整说明.例如:

package example;

import java.lang.reflect.Method;

class A{
    private void privateMethod(){
        System.out.println("hello privateMethod()");
    }
}
class B{
    public static void main(String[] args) throws Exception {
        A d = new A();
        Method m = A.class.getDeclaredMethod("privateMethod");       
        m.setAccessible(true);
        m.invoke(d);
    }
}
Run Code Online (Sandbox Code Playgroud)

请详细解释这种方法的情景?我需要其他类中私有方法可访问性的优点和缺点吗?

小智 1

所有“私有”和其他形式的声明都是开发工具的标志,以便它知道您打算如何使用相关字段或方法。这样,当开发人员以非预期的方式使用这些类/字段/方法时,开发工具可以向开发人员发出警告或错误。

反射是一种工具,它可以让开发人员忽略或规避这些标志,这些标志表明您正在以从未想过的方式使用类/字段/方法。所以总的来说,反射显示出糟糕的架构。

因此,将某事物声明为私有、公共或静态并没有“优点或缺点”;它们只是帮助保持代码整洁和分隔的工具,仅允许开发人员以特定方式访问/使用您的类/字段/方法。

  • 这是不正确的。当存在安全管理器时,JVM 将强制执行可访问性(禁用反射解决方法)。说这“只是”编译时提示是错误的;只是默认情况下未启用安全管理器(并且在存在 SM 的情况下构建应用程序更加困难)。这些反射特性被一些非常有用的框架使用,例如类似序列化的框架、分布式对象缓存、持久性框架和模拟框架。 (3认同)