<< 2006/12/21 | Home | 2006/12/23 >>
PR: 転職    転職    合宿免許    漫画    シルバー    ブライダルエステ    墓地・霊園    葬式   

finalフィールドって変更できるんだ。

リフレクション使えば、finalフィールドって変更できるんだね。

import java.lang.reflect.Field;

public class Test {
    final int i = 1;

    public static void main(String[] args) throws Exception {
        Test test = new Test();

        Field field = Test.class.getDeclaredField("i");
        field.setAccessible(true);
        field.set(test, 123);

        System.console().printf("i = %d%n", field.getInt(test));
        System.console().printf("i = %d%n", test.i);
    }
}
$ java Test
i = 123
i = 1

しかしfinalフィールドは、値がインライン展開されるから、リフレクションで取得した値と、普通にアクセスした値が異るという、イヤな結果に。むしろfinalフィールドの変更はリフレクション経由の場合もエラーにした方が良かったんじゃないか?

このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8