Java文档提到使用f.setAccessible(true)
方法可以违反封装原则。
但是,如果我编写了一个具有完全安全性的类,例如带有私有变量的类,如何防止它被反射访问呢?
例如,我有一个带有完全保护的实例变量的类:
public final class Immutable {
private final int someVal;
public Immutable(int someVal) {
this.someVal = someVal;
}
public int getVal() {
return someVal;
}
}
但我可以使用反射来修改那个实例变量,就像这样:
public class Tester {
public static void main(String[] args)
throws NoSuchFieldException, SecurityException,
IllegalArgumentException, IllegalAccessException {
Immutable i = new Immutable(10);
// output 10
System.out.println(i.getVal());
Field f = i.getClass().getDeclaredField("someVal");
f.setAccessible(true);
f.set(i, 11);
// output is 11 which implies some value modified
System.out.println(i.getVal());
}
}
在我的代码中,我如何防止使用反射改变一个不可变类?
SecurityManager
。 - Sotirios Delimanolis