リフレクション (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