我只是在想,我想知道:由于访问控制只是为了防止意外而不是欺诈,我想知道是否有可能在Java中访问隐藏变量的值?
以示例为例
public Cat {
public int numberOfLegs = 4;
private int numberOfWhiskers = 42;
}
是否可以从此课程外部找到numberOfWhiskers的值?
编辑:我已经阅读了链接中的线程,我可以看到通过使用SetAccesible(),您可以获得您知道其名称的任何私有字段的值。 我们能找到一个我们不知道名字的字段的值吗?
注意:可以在某些语言(如C ++)中完成,例如使用迭代跨类中字段的指针。
答案 0 :(得分:3)
您可以使用反射来绕过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.