由于几乎每个人都知道Java中的字符串是不可变的。 最近,我发现了一些可能认为它并非总是如此。 让我们来试试下面的代码:
System.out.println("-------- BEFORE MODIFICATIONS --------");
String beforeTest = new String("Original");
System.out.println(beforeTest);
java.lang.reflect.Field valueField = String.class.getDeclaredField("value");
valueField.setAccessible(true);
valueField.set("Original", "Modified".toCharArray());
System.out.println("-------- AFTER MODIFICATIONS --------");
System.out.println(beforeTest);
System.out.println("Original");
String test = new String("Original");
System.out.println(test);
String test2 = new String("Original 2");
System.out.println(test2);
输出将是:
-------- BEFORE MODIFICATIONS --------
Original
-------- AFTER MODIFICATIONS --------
Original
Modified
Modified
Original 2
请问这个伎俩工作? 如何在JVM知道哪些对象应该被改变,并且不是? 此招的引擎盖下有什么机制? 为什么已经创建beforeTest
字符串没有改变? 这是否招果然减损的strings are immutable
的原则?