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

时间:2015-10-16 07:50:27

标签: java reflection

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

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

然后为什么可以访问其他类中的私人事物? 这个术语(反射)完全溢出了我在java中的私有(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);
    }
}

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

2 个答案:

答案 0 :(得分:1)

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

Reflection是一种工具,它允许开发人员忽略或绕过这些标志,这些标志表明您正在以一种从未想过的方式使用类/字段/方法。所以一般情况下反映显示不良架构。

因此宣称私人或公共或静态的东西没有“优点或缺点”;它们只是帮助开发人员以特定方式访问/使用您的类/字段/方法来帮助保持代码清洁和划分的工具。

答案 1 :(得分:1)

在大多数情况下,访问修饰符旨在帮助保留您不希望人们绑定到视图之外的部分代码。从工具角度来看,使用反射访问私有方法的能力非常有用。 Java具有允许禁用此功能的安全机制。这个site有一些关于与反射相关的java安全模型的信息(页面底部。)

这非常适用于使用不受信任的代码执行代码的情况。如果其他开发人员可以访问您的代码或拥有您的库,那么在没有安全管理器或更改修改器的情况下,您无法阻止他们运行代码。这仅在受控环境中有效。