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