相关疑难解决方法(0)

如何在Sun的JVM中禁用延迟类加载/初始化?

默认情况下,Sun的JVM都懒惰地加载类并且懒惰地初始化(即调用它们的<clinit>方法)它们.考虑以下类,ClinitBombExceptionstatic{}块中抛出一个.

public class ClinitBomb {
    static {
        explode();
    }   
    private static void explode() {
        throw new RuntimeException("boom!");
    }       
}
Run Code Online (Sandbox Code Playgroud)

现在,考虑如何触发炸弹:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

我们保证爆炸发生在B点之前,因为forName文件说明了这一点; 问题是它是否发生在A点之前(Main加载时).在Sun的JVM中,即使main()包含静态引用ClinitBomb,它也会在A之后发生.

我想要一种方法告诉JVM ClinitBomb一旦初始化就加载并初始化Main(因此炸弹 A点之前爆炸).一般来说,我想要一种方式来说,"无论何时加载/初始化类X,对任何一个也是如此它引用的Y类."

有没有办法做到这一点?

java class classloader static-initializer

12
推荐指数
1
解决办法
4572
查看次数

标签 统计

class ×1

classloader ×1

java ×1

static-initializer ×1