По умолчанию Sun JVM и лениво загружает классы, и лениво инициализирует их (т.е. вызывает их методы
). Рассмотрим следующий класс, ClinitBomb
, который выдает исключение
во время статического {}
блока.
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, на которые он ссылается».
Есть ли способ сделать это?