Изменяемые строки в Java

Поскольку почти все знают, что строки в 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не была изменена? Действительно ли этот трюк нарушает принцип строки неизменны?

12
задан Chan 23 June 2012 в 02:38
поделиться