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フィールドの変更はリフレクション経由の場合もエラーにした方が良かったんじゃないか?








