По умолчанию 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");
}
}
Мы гарантируем, что взрыв произойдет до точки B, так как forName документация говорит так; вопрос заключается в том, происходит ли это до точки A (когда загружается Main.) В Sun JVM, хотя main() содержит статическую ссылку на ClinitBomb, это происходит после A.
Я хочу, чтобы JVM мог загружать и инициализировать ClinitBomb, как только он инициализирует Main (поэтому бомба взрывается перед точкой A.) В общем, я хочу сказать: "всякий раз, когда вы загружаете/инициализируя класс X, также делают это для любых классов Y, которые он ссылается."
Есть ли способ сделать это?