使用反射时需要注意的潜在问题是什么?我在反思中很困惑,为什么java提供这种类型的功能来访问私有数据成员。
私人:就像我想的那样,只有声明它的类才能看到它
Then为什么可以在其他类中访问私有的东西?这个术语(反射)完全超出了我在java中的私有(访问说明符)属性的概念。
我访问了许多关于这个主题的链接,但没有给出关于这个主题的完整解释。如:
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);
}
}
那么请深入解释一下这种方法的场景?我需要在其他类中的私有方法可访问性的优点和缺点?
所有"Private"和其他形式的声明都是开发工具的标志,以便它知道您打算如何使用有问题的字段或方法。这样,当开发人员使用这些类/字段/方法时,开发工具就可以向他们发出警告或错误。
Reflection是一个工具,它可以让开发人员忽略或绕过这些标志,这些标志表明你以一种从未想过的方式使用了类/字段/方法。所以总的来说,反射显示了糟糕的建筑。
因此,声明某物为私有、公共或静态没有"优点或缺点";它们只是通过只允许开发人员以特定的方式访问/使用您的类/字段/方法来帮助保持代码整洁和划分的工具。
在大多数情况下,访问修饰符的目的是帮助将不希望人们绑定到的部分代码保留在视图之外。从工具的角度来看,使用反射访问私有方法的能力是有用的。Java有一个安全机制,允许禁用此特性。这个站点有一些关于与反射相关的java安全模型的信息(页面底部)
这实际上只在您的代码将与不受信任的代码一起执行的情况下才重要。如果其他开发人员可以访问您的代码或拥有您的库,那么在没有安全管理器或更改修饰符的情况下,您无法阻止他们运行代码。