Cordas mutáveis ​​em Java

Como quase todo mundo sabe, as strings em Java são imutáveis. Recentemente descobri algo que pode sugerir que nem sempre é verdade. Vamos experimentar este código:

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

a saída seria:

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

Como esse truque funciona? Como a JVM sabe quais objetos devem ser alterados e quais não? Qual mecanismo está sob o capô desse truque? Por que já criadobeforeTest string não foi alterada? Esse truque realmente derroga ostrings are immutable princípio?

questionAnswers(1)

yourAnswerToTheQuestion