繁体   English   中英

使字符串真正不可变

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM