Veränderbare Zeichenfolgen in Java

Wie fast jeder weiß, sind Strings in Java unveränderlich. Kürzlich habe ich etwas entdeckt, das darauf hindeutet, dass es nicht immer wahr ist. Probieren wir diesen Code aus:

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

die Ausgabe wäre:

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

Wie funktioniert dieser Trick? Woher weiß die JVM, welche Objekte geändert werden sollen und welche nicht? Welcher Mechanismus steckt unter der Haube dieses Tricks? Warum schon erstelltbeforeTest Zeichenfolge wurde nicht geändert? Ist dieser Trick wirklich eine Ausnahme?strings are immutable Prinzip?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage