リフレクション (1) - final
import java.lang.reflect.*; class Main { public static void main(String[] args) throws Exception { Hoge hoge = new Hoge(); System.out.println(hoge.x); Field f = Hoge.class.getField("x"); f.setAccessible(true); f.setInt(hoge, 2); System.out.println(hoge.x); } } class Hoge { public final int x = new Integer(1).intValue(); // 最適化防止 }
final フィールドは通常は変更できないが、デシリアライズの時などに必要になるので、リフレクション経由での変更は許可されている。なお、Java 1.5 では static final フィールドは変更できないらしい。
(参考:JLS 17.5.3)