Java'daki dizeler neredeyse herkesin bildiği gibi değişmez. Son zamanlarda her zaman doğru olmadığını düşündürecek bir şey keşfettim. en bu kodu deneyelim:Java'da değişken dizgiler
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);
çıkışı olacaktır:
bu hile nasıl çalışır-------- BEFORE MODIFICATIONS --------
Original
-------- AFTER MODIFICATIONS --------
Original
Modified
Modified
Original 2
? JVM hangi nesnelerin değiştirileceğini ve hangilerinin bilinmemesi gerektiğini nasıl biliyor? Bu numaranın başlığı altında hangi mekanizma var? Neden zaten oluşturulmuş beforeTest
dize değişmedi? Bu hile gerçekten strings are immutable
ilkesini derogate ediyor mu?
Yansıma kara büyü voodoo. –
@HovercraftFullOfEels, Yansıma mükemmel bir şekilde tanımlanmıştır. Sadece "özel" yi "setAccessible" ile çağırarak, çekirdek sınıf değişmezlerinin pencereden dışarı çıktığını gösterir. –
@MikeSamuel Reflection * kendisi * iyi tanımlanmış. * Kullanarak değil, bu yüzden bir zamanlar mucizevi olmayan başlangıçlar için voodoo. Bunun için bütün bir çerçevem var (Muckito). –