使String真的不可变

时间:2011-07-19 13:25:42

标签: java string mutable

我有一个问题,但要得到答案,首先要接受以下事实:在某些情况下,可以修改Java字符串。

Artima文章中标题为:“hi there”.equals(“cheers!”)== true

链接:http://www.artima.com/weblogs/viewpost.jsp?thread=4864

它仍然在Java 1.6中运行良好,它肯定会以某种方式反对流行的信念,即重复“Java Strings总是不可变的”

所以我的问题很简单:可以像这样修改字符串吗?是否有任何JVM安全设置可以打开以防止这种情况?

2 个答案:

答案 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。如果没有,那我就不会打扰了。如果人们想要如此绝望地在脚下射击,那么他们应该被允许。