По умолчанию 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, которые он ссылается."
Есть ли способ сделать это?