ほとんどの人が知っているように、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
文字列が変更されなかったのはなぜですか? このトリックは本当にstrings are immutable
原則を軽視しているのでしょうか?