【发布时间】:2015-03-25 01:39:18
【问题描述】:
在 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。 -
除非您让不知名的人将插件添加到您正在创建的东西中,否则您不必担心这一点。您要制作什么应用程序?
-
如果您担心安全性,限制对反射的访问是不够的。如果不受信任的代码可以读取、写入或删除计算机上的任何文件,那么它无法访问某个对象属性对计算机的所有者没有多大帮助。
标签: java reflection