デフォルトでは、Sun の JVM は、クラスを遅延ロードし、遅延初期化 (つまり、それらの<clinit>メソッドを呼び出す) の両方を行います。ブロック中にClinitBombをスローする次のクラスを考えてみましょう。Exceptionstatic{}
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 参照します。」
それを行う方法はありますか?