Java 专用访问控制

Java 专用访问控制,java,Java,我只是在想,我想知道:既然访问控制只是为了防止意外而不是欺诈,我想知道是否有可能访问Java中隐藏变量的值 例如 public Cat { public int numberOfLegs = 4; private int numberOfWhiskers = 42; } 有可能从这个类之外找到numberOfWhiskers的值吗 编辑:我已经阅读了链接中的线程,我可以看到通过使用setAccessible()可以获得任何您知道其名称的私有字段的值我们能找到一个我们不知道名称的字段的值吗?

我只是在想,我想知道:既然访问控制只是为了防止意外而不是欺诈,我想知道是否有可能访问Java中隐藏变量的值

例如

public Cat {

public int numberOfLegs = 4;
private int numberOfWhiskers = 42;

}
有可能从这个类之外找到numberOfWhiskers的值吗

编辑:我已经阅读了链接中的线程,我可以看到通过使用setAccessible()可以获得任何您知道其名称的私有字段的值我们能找到一个我们不知道名称的字段的值吗?


注意:这个“强”>可以在某些语言(如C++)中使用,例如使用指针遍历类中的字段。

< P>可以使用反射来绕过私下<代码>检查。使用方法和方法(还有其他访问器)

Field[] fields = Cat.class.getDeclaredFields();
// Iterate over the array here.
此代码可以位于另一个类中:

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 */ }
编辑

我已经看到了重复问题的链接。我必须同意,通常情况下,不要这样做

第二次编辑

作为对附加编辑问题的响应,您可以使用该方法返回一个
字段[]
,您可以使用该字段迭代类的所有字段

Field[] fields = Cat.class.getDeclaredFields();
// Iterate over the array here.

您可以使用反射绕过
private
检查。使用方法和方法(还有其他访问器)

此代码可以位于另一个类中:

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 */ }
编辑

我已经看到了重复问题的链接。我必须同意,通常情况下,不要这样做

第二次编辑

作为对附加编辑问题的响应,您可以使用该方法返回一个
字段[]
,您可以使用该字段迭代类的所有字段

Field[] fields = Cat.class.getDeclaredFields();
// Iterate over the array here.

我有点不同意你的前提。事实上,Java的设计目的是为VM提供保护,防止其内部运行不可信的代码。这就是安全管理器和安全模型的设计目的。访问控制是安全模型不可分割的一部分,并且在运行时进行验证,它们不仅仅在编译时使用。我有点不同意您的假设。事实上,Java的设计目的是为VM提供保护,防止其内部运行不可信的代码。这就是安全管理器和安全模型的设计目的。访问控制是安全模型不可分割的一部分,在运行时进行验证,而不仅仅是在编译时使用。