Zmienne łańcuchy w Javie

Jak prawie każdy wie, że ciągi w Javie są niezmienne. Niedawno odkryłem coś, co może sugerować, że nie zawsze jest prawdziwe. Wypróbujmy ten kod:

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);

wyjście będzie:

-------- BEFORE MODIFICATIONS --------
Original
-------- AFTER MODIFICATIONS --------
Original
Modified
Modified
Original 2

Jak działa ta sztuczka? Jak JVM wie, które obiekty należy zmienić, a które nie? Jaki mechanizm znajduje się pod maską tej sztuczki? Dlaczego już stworzonebeforeTest ciąg nie został zmieniony? Czy ta sztuczka naprawdę odbiega od tegostrings are immutable zasada?

questionAnswers(1)

yourAnswerToTheQuestion