기본적으로 Sun의 JVM은 모두 클래스를 지연로드하고 느리게 초기화 (예 : <clinit>
메소드 호출)합니다. ClinitBomb
클래스를 고려하면 static{}
블록 중에 Exception
을 던집니다.Sun의 JVM에서 지연 클래스로드/초기화를 비활성화하려면 어떻게합니까?
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");
}
}
을 우린 forName
의 설명서 이렇게 말한다 이후 폭발, 점 B 전에 발생 보장; 문제는이
가 나는 방법은로드 JVM을 말하고 싶어 A. 후에 발생하고,이 main()
가 ClinitBomb
에 대한 정적 참조를 포함하더라도, Sun의 JVM에서 (Main
이로드 될 때.) A 지점 전에 발생 여부 Main
을 초기화하자마자 ClinitBomb
을 초기화하십시오. (따라서 폭탄은 보다 앞서 점 A를 폭발시킵니다.) 일반적으로 나는 "클래스 X를로드/초기화 할 때마다 참조하는 클래스 Y에 대해서도 그렇게합니다."라고 말하고 싶습니다.
할 방법이 있습니까?
메인의 ClinitBomb를 참조하는 정적 블록? –
@ Thorbjørn Ravn Andersen은 일반적인 문제를 해결하지 못할 것입니다. 하지만 사용자 정의 클래스 로더가로드 된 모든 클래스에 정적 블록을 삽입 할 수 있다고 가정합니다. – emory
'Class.forName()'의 거대한 목록을 추가하지 못하는데 잘 모르겠습니다. 오토, 왜 그렇게 중요한거야? – Bill