私人访问控制 [重复]
Posted
技术标签:
【中文标题】私人访问控制 [重复]【英文标题】:Private Access Control [duplicate] 【发布时间】:2013-03-24 09:51:33 【问题描述】:我只是在想,我想知道:因为访问控制只是为了防止意外而不是防止欺诈,所以我想知道是否可以访问 Java 中隐藏变量的值?
举个例子
public Cat
public int numberOfLegs = 4;
private int numberOfWhiskers = 42;
是否可以从这个类之外找到 numberOfWhiskers 的值?
编辑:我已阅读链接中的线程,我可以看到通过使用 SetAccesible() 您可以获得您知道名称的任何私有字段的值。 我们能否找到我们不知道名称的字段的值?
注意:这可以在某些语言(例如 C++)中完成,例如通过使用指针在类中的字段之间进行迭代。
【问题讨论】:
我有点不同意你的前提。事实上,Java 旨在为 VM 提供保护,使其免受在其中运行的不受信任的代码的影响。这就是安全管理器和安全模型的设计目的。访问控制是安全模型的一个组成部分,并在运行时进行验证,它们不仅仅在编译时使用。 【参考方案1】:您可以使用反射绕过private
检查。使用Class#getDeclaredField
方法和Field#getInt
方法(还有其他访问器)。
此代码可以在另一个类中:
Cat myCat = new Cat();
int whiskers;
try
Field field = Cat.class.getDeclaredField("numberOfWhiskers");
// This line bypasses the private control
field.setAccessible(true);
whiskers = field.getInt(myCat);
catch (NoSuchFieldException e) /* Handle */
catch (IllegalAccessException e) /* Handle */
编辑
我看到了重复问题的链接。我必须同意,通常情况下,不要这样做。
第二次编辑
针对额外编辑的问题,您可以使用Class#getDeclaredFields
方法返回一个Field[]
,您可以使用它来遍历类的所有字段。
Field[] fields = Cat.class.getDeclaredFields();
// Iterate over the array here.
【讨论】:
以上是关于私人访问控制 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有“朋友”的情况下访问课外的私人数据成员? [重复]