私人访问控制 [重复]

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.

【讨论】:

以上是关于私人访问控制 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在不使用朋友类的情况下访问私人成员[重复]

如何在没有“朋友”的情况下访问课外的私人数据成员? [重复]

Angular 2 - 没有访问控制允许原始标头[重复]

缺少访问控制允许来源[重复]

HTTP 访问控制 (CORS) 可以阻止其他域运行我的脚本吗?

没有访问控制允许在rails中起源[重复]