ほとんど誰もが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
文字列は変更されませんでしたか?このトリックは本当にstrings are immutable
の原則を逸脱していますか?
反射は黒い魔法のブードーです。 –
@HovercraftFullOfEels、Reflectionは完全に定義されています。これは、 'setAccessible'を呼び出すことによって' private'に違反したときにのみ、コアクラスの不変条件がウィンドウ外に出ます。 –
@MikeSamuel Reflection *自体はよく定義されています。 *使用していないので、一度unmuckable開始moodingブードー。私はこれのための全体的な枠組みを持っています(Muckito)。 –