Foo.class does not initialize class Foo!

Tiger(JDK1.5)からは,

Foo.class

とやっただけでは,static初期化子は実行されないよって話.実際に試してみたけど,本当にそうだった.確実に初期化したければ,「Class.forName()」を使わないとイケナイようだ.


そんな話,聞いてないよ〜.

これまで、クラスリテラル (Foo.class など) を評価するとクラスが初期化されました。5.0 では初期化されません。前の動作に依存するコードは書き直す必要があります。
Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle

(追記)ちょっと誤解されそうなので補足しときますが,Class.forName()しないとstatic初期化子が動かないわけでは無いス.こんな具合にstaticメソッド呼べば,その直前にstatic初期化子は実行される.

public class Main {
    public static void main(String[] args) {
        System.out.println(Foo.class);
        Foo.bar();
    }
}

public class Foo {
    static {
        System.out.println("Initialization Foo...");
    }

    public static void bar() {
        System.out.println("call bar...");
    }
}

Tigerでの実行結果はこう.

$ java -cp . Main
class Foo
Initialization Foo...
call bar...

static初期化子の実行タイミングがちょっと遅れるだけなので,大局に影響なしっていうか,一種のトリビアですね.せいぜい,ログとか出してたら,出てくるタイミングがズレるくらいだろうか.


むしろ,このタイミングのズレが命取りになるような実装しちゃイカンだろう.
って自分の胸に手を当ててみる.:-D


(さらに追記)どうやら,この件で困っている人もいるようだ(問題となったコードは,まだ追えてない).
http://weblogs.java.net/blog/mister__m/archive/2006/08/bitten_by_the_c.html


この人,クラスの初期化を明示するRFE*1を上げていたので,せっかくだから投票しといた.もっかしたらJDK7から使えるようになるかも知れない(気の長い話だ).
Bug ID: JDK-6459208 Add API for initializing a Class and checking if it has been initialized
 →Bug ID: JDK-4993813 (reflect) Need a way to force a class to be initialized.

*1:Request For Enhancement