java - 使用反射更改字符串的效果

标签 java jvm immutability

众所周知,String在java中是不可变的。但是,可以通过获取 Field 和设置访问级别来使用反射来更改它。 (我知道这是不明智的,我不打算这样做,这个问题是纯理论的)。

我的问题:假设我知道我在做什么(并根据需要修改所有字段),程序会正常运行吗?还是 jvm 进行了一些依赖于 String 不可变的优化?我会遭受性能损失吗?如果是这样,它做了什么假设?程序会出什么问题

附注String 只是一个示例,除了示例之外,我实际上对一般答案感兴趣。

谢谢!

最佳答案

编译后一些字符串可能引用一个实例,因此,您将编辑比您想要的更多的内容,并且永远不知道您还编辑了什么。

public static void main(String args[]) throws Exception {
    String s1 = "Hello"; // I want to edit it
    String s2 = "Hello"; // It may be anywhere and must not be edited
    Field f = String.class.getDeclaredField("value");
    f.setAccessible(true);
    f.set(s1, "Doesn't say hello".toCharArray());
    System.out.println(s2);
}

输出:

Doesn't say hello

关于java - 使用反射更改字符串的效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6932772/

相关文章:

java - Spring-boot Rest api页面调用

java - 共享 JVM session

用于强制自定义类型的不变性的 Python 元类

python - 别名 self = super(...).__new__(...)?为什么?

Java和Weka : Creating a string attribute

java - 跨越tomcat和django

java - 在 Java 17 switch-case 中使用 final 变量的好处

maven-2 - Maven 2.1.0 未将系统属性传递给 Java 虚拟机

windows - 通过 Windows 桌面快捷方式运行 Eclipse JVM 参数

xcode - 对象为 Nil 时的行为 MutableCopy