Vì hầu hết mọi người đều biết các chuỗi trong Java là không thay đổi. Gần đây tôi đã khám phá ra điều gì đó có thể gợi ý rằng nó không phải lúc nào cũng đúng. Hãy thử mã này:Các chuỗi có thể thay đổi trong 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);
đầu ra sẽ là:
-------- BEFORE MODIFICATIONS --------
Original
-------- AFTER MODIFICATIONS --------
Original
Modified
Modified
Original 2
làm việc như thế này lừa? Làm thế nào để JVM biết đối tượng nào cần được thay đổi và cái nào không? Cơ chế nào dưới sự che chở của thủ thuật này? Tại sao chuỗi beforeTest
không được thay đổi? Thủ thuật này có thực sự vi phạm nguyên tắc strings are immutable
không?
Phản ánh là ma thuật voodoo đen. –
@HovercraftFullOfEels, Reflection hoàn toàn được xác định rõ. Chỉ khi bạn vi phạm 'riêng tư 'bằng cách gọi' setAccessible' là những bất biến của lớp lõi đi ra ngoài cửa sổ. –
@MikeSamuel Reflection * chính nó * được xác định rõ. * Sử dụng * nó không phải là, do đó voodoo một lần mucking bắt đầu unmuckable. Tôi có toàn bộ khuôn khổ cho điều này (Muckito). –