[英]Making a String really immutable
我有一个问题,但要得到答案,首先必须接受以下事实:在某些情况下,可以修改 Java 字符串。
这已在题为“hi there”.equals(“cheers !”) == true的 Artima 文章中得到证明
链接: http://www.artima.com/weblogs/viewpost.jsp?thread=4864
它在 Java 1.6 中仍然可以很好地工作,而且它肯定在某种程度上违背了流行的信念,即重复“Java 字符串总是不可变的” 。
所以我的问题很简单:字符串总是可以这样修改吗?是否有任何 JVM 安全设置可以打开来防止这种情况发生?
您需要添加一个 SecurityManager。 这个网站有一个例子和解释:
运行:
java -Djava.security.manager UseReflection
和代码:
import java.lang.reflect.Field;
import java.security.Permission;
public class UseReflection {
static{
try {
System.setSecurityManager(new MySecurityManager());
} catch (SecurityException se) {
System.out.println("SecurityManager already set!");
}
}
public static void main(String args[]) {
Object prey = new Prey();
try {
Field pf = prey.getClass().getDeclaredField("privateString");
pf.setAccessible(true);
pf.set(prey, "Aminur test");
System.out.println(pf.get(prey));
} catch (Exception e) {
System.err.println("Caught exception " + e.toString());
}
}
}
class Prey {
private String privateString = "privateValue";
}
class MySecurityManager extends SecurityManager {
public void checkPermission(Permission perm) {
if(perm.getName().equals("suppressAccessChecks")){
throw new SecurityException("Can not change the permission dude.!");
}
}
}
所有反射操作都受您安装的SecurityManager
的检查。
如果您担心恶意代码,那么无论如何您都必须拥有一个SecurityManager
。 如果没有,那我就不打扰了。 如果人们如此拼命地想朝自己的脚开枪,他们应该被允许。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.