我有一个问题,但要得到答案,首先要接受以下事实:在某些情况下,可以修改Java字符串。
Artima文章中标题为:“hi there”.equals(“cheers!”)== true
链接:http://www.artima.com/weblogs/viewpost.jsp?thread=4864
它仍然在Java 1.6中运行良好,它肯定会以某种方式反对流行的信念,即重复“Java Strings总是不可变的”。
所以我的问题很简单:可以像这样修改字符串吗?是否有任何JVM安全设置可以打开以防止这种情况?
答案 0 :(得分:7)
您需要添加SecurityManager。 This site有一个例子和解释:
使用以下命令运行:
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.!");
}
}
}
答案 1 :(得分:5)
所有反射操作都要经过您安装的SecurityManager
检查。
如果您担心恶意代码,则无论如何都必须有SecurityManager
。如果没有,那我就不会打扰了。如果人们想要如此绝望地在脚下射击,那么他们应该被允许。