Как отключить отложенную загрузку / инициализацию классов в JVM Sun?

По умолчанию 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, на которые он ссылается».

Есть ли способ сделать это?

12
задан jon 13 December 2011 в 23:21
поделиться