3

String が Java で不変であることは誰もが知っています。文字列が作成されると、コンテンツは変更できません。


文字列は文字配列を使用して文字char[] value列コンテンツを格納します。ここにJavaコードがあります-

/** The value is used for character storage. */
    private final char value[];

フィールドへのアクセス権を取得しvalues[]て変更したらどうなるでしょうか? このコードを参照してください -

            String name = "Harish";
            System.out.println(name); // Harish           
            Field field = name.getClass().getDeclaredField("value");
            field.setAccessible(true);
            char[] value = (char[]) field.get(name);
            value[0] = 'G';
            value[1] = 'i';
            System.out.println(Arrays.toString(value)); // [G, i, r, i, s, h]
            System.out.println(name); // Girish

このようにして、String Immutability Principleに反する文字列の内容を変更できると思います。

私は何かを逃していますか?

4

1 に答える 1

7

いいえ、何も見逃していません。リフレクションを使用してアクセスできないフィールドをアクセス可能にする場合、「通常の」OOP の方法で使用されたときに型によって提供されるすべての保証を失うことを明示的に要求します。

于 2015-06-04T20:21:09.167 に答える