默认情况下,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
后立即加载和初始化(因此炸弹在 A 点之前Main
爆炸。)一般来说,我想说“每当加载/初始化类 X 时,也对任何它引用的 Y 类。”
有没有办法做到这一点?