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