Como casi todo el mundo sabe, las cadenas en Java son inmutables. Recientemente descubrí algo que podría sugerir que no siempre es verdad. Vamos a probar este código:Cadenas mutables en 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);
la salida sería:
-------- BEFORE MODIFICATIONS --------
Original
-------- AFTER MODIFICATIONS --------
Original
Modified
Modified
Original 2
¿Cómo funciona este truco? ¿Cómo sabe la JVM qué objetos se deben cambiar y cuáles no? ¿Qué mecanismo están bajo el capó de este truco? ¿Por qué la cadena beforeTest
ya creada no se modificó? ¿Este truco realmente deroga el principio strings are immutable
?
La reflexión es magia negra vudú. –
@HovercraftFullOfEels, Reflection está perfectamente definido. Solo cuando violas 'privado' al llamar a 'setAccessible', las invariantes de la clase central se apagan. –
@MikeSamuel Reflection * en sí * está bien definido. * Usar * no lo es, por lo tanto, el vudú una vez que se extrae lo inamovible comienza. Tengo un marco completo para esto (Muckito). –