北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

privateは絶対領域か?(2)

絶対領域をおかしてしまうとどうなるのか(゜ー゜)。

先の方式を使うと、Stringオブジェクトを書き換え可能になります。次のメソッドを定義します。

    /* strToの中身をstrFromにする。
       ただし、短い文字列に変更しようとすると
       ArrayIndexOutOfBoundsException
       になるので気をつけて。 */
    static void changeString(String strTo, String strFrom){
	Class classString = strTo.getClass();

	Field charField   = null;
	try{
	    charField = classString.getDeclaredField("value");
	}catch(NoSuchFieldException e){
	    e.printStackTrace();
	    System.exit(-1);
	}
	charField.setAccessible(true);

	try{
	    charField.set(strTo, strFrom.toCharArray());
	}catch(IllegalAccessException e){
	    e.printStackTrace();
	    System.exit(-1);
	}
	
	return;
    }

利用例を見てみましょう。

	String str = "hoge";
	System.out.println(str);
	changeString(str, "test");
	System.out.println(str);

/*
実行結果:
hoge
test
*/

でも、これだけではありません。次のコードはもっと大変なことになってます。

	changeString("Hiratara", "Horiemon");
        /* さて、自己紹介してみる。 */
	System.out.print("My name is '");
	System.out.print("Hiratara");
	System.out.print("'\n");

/*
実行結果:
My name is 'Horiemon'
*/

常識では考えられませんな。。。


追記。Mapによる実験もしてみましたが、あまり面白い結果にはなりませんでした。

と言うのは、Stringの場合、文字列の中身を強引に変えてもhashCode()は変化しないからです。これは、論理的に同値のオブジェクトについてシングルトンになるように実装されてるからだと思います。