【问题标题】: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 提供保护,使其免受在其中运行的不受信任的代码的影响。这就是安全管理器和安全模型的设计目的。访问控制是安全模型的一个组成部分,并在运行时进行验证,它们不仅仅在编译时使用。

标签: java


【解决方案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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2013-01-27
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多