デフォルトでは、Sun の JVM は、クラスを遅延ロードし、遅延初期化 (つまり、それらの<clinit>
メソッドを呼び出す) の両方を行います。ブロック中にClinitBomb
をスローする次のクラスを考えてみましょう。Exception
static{}
public class ClinitBomb {
static {
explode();
}
private static void explode() {
throw new RuntimeException("boom!");
}
}
ここで、爆弾をトリガーする方法を検討してください。
public class Main {
public static void main(String[] args) {
System.out.println("A");
try {
Class.forName("ClinitBomb");
} catch (Exception e) {
e.printStackTrace(System.out);
}
System.out.println("B");
ClinitBomb o2 = new ClinitBomb();
System.out.println("C");
}
}
forName
のドキュメントにそう書かれているので、点 B の前に爆発が起こることが保証されています。問題は、ポイント A の前 ( がロードされるとき) に発生するかどうかMain
です。Sun の JVM では、main()
への静的参照が含まれていても、ポイント A のClinitBomb
後に発生します。
JVM が初期化ClinitBomb
されるとすぐにロードして初期化するように指示する方法が必要です (したがって、爆弾はポイント Aの前Main
で爆発します)。クラス Y 参照します。」
それを行う方法はありますか?