클래스의 정적 블록은 언제 실행됩니까?
2 개의 병이 있는데, a.jar과 b.jar이라고 부르겠습니다.
b.jar는 a.jar에 의존합니다.
a.jar에서 클래스를 정의했습니다. StaticClass라고 부르겠습니다. StaticClass에서 "init"라는 메서드를 호출하는 정적 블록을 정의했습니다.
public class StaticClass {
static {
init();
}
public void static init () {
// do some initialization here
}
}
b.jar에는 메인이 있으므로 메인에서는 init () 메서드가 호출되었다고 예상하지만 실제로는 그렇지 않습니다. 나는 StaticClass가 jvm에 의해로드되지 않았기 때문에 누군가가 나에게 말할 수 있다고 생각합니다.
- 내 결론이 맞습니까?
- jvm이 클래스를로드하도록 트리거하는 것은 무엇입니까?
- 정적 블록을 자동으로 실행하려면 어떻게해야합니까?
감사
그래 네가 맞아. 정적 초기화 블록은 JVM (구체적으로는 클래스 로더) StaticClass
이로드 될 때 실행됩니다 ( 코드에서 처음 참조 될 때 발생 함).
StaticClass.init()
JVM에 의존하는 것보다 명시 적으로 호출하여이 메소드를 강제로 호출 할 수 있습니다 .
를 사용 Class.forName(String)
하여 JVM이 클래스를로드하고 정적 블록을 호출하도록 할 수도 있습니다 .
예, 맞습니다. 사용 StaticClass
하지 않기 때문에 VM에 의해로드 init()
되지 않으므로 실행되지 않습니다.
두 번째 질문에 대해서는 어려운 길을 가고 사용 가능한 모든 클래스를 스캔하고로드해야 할 것입니다.
https://stackoverflow.com/a/3223019/393657
당신 말이 맞습니다. 가장 쉬운 방법은 수업에 접근하는 것입니다.
StaticClass.class.newInstance();
또는 당신의 주요 방법에 대한 존경심에 대한 것. 이렇게하면 클래스 로더가 클래스를로드합니다.
정적 코드는 클래스 StaticClass
가 참조 될 때 실행됩니다 .
당신이 작성하는 경우 따라서, 실행해야 새로운 인스턴스 의를 StaticClass
하거나 경우 정적 방법 중 하나를 호출 .
로드 된 클래스가 먼저 초기화되거나 참조 될 때 정적 블록이 실행됩니다. 클래스를로드하는 것은 클래스가 초기화된다는 것을 의미하지 않습니다. JVM 클래스 로딩은 별개의 문제입니다.
우선 클래스 로딩은 클래스 초기화와 다릅니다. Java 언어 사양에서 설명을 찾는 사람은 언제 정적 블록이 실행되는지-여기에 있습니다.
JLS는 §8.7 것을 말한다 :
클래스에서 선언 된 정적 이니셜 라이저는 클래스가 초기화 될 때 실행됩니다 (§12.4.2).
그렇다면 초기화는 무엇을 의미합니까? JLS §12.4.2를 참조하십시오 . 자세한 초기화 절차를 설명합니다. 그러나 여기에서는 JLS §12.4.1 이 더 적절할 수 있습니다. 그것은 말한다 :
클래스 또는 인터페이스 유형 T는 다음 중 하나가 처음 발생하기 직전에 초기화됩니다.T는 클래스이고 T의 인스턴스가 생성됩니다. T는 클래스이고 T에 의해 선언 된 정적 메서드가 호출됩니다. T에 의해 선언 된 정적 필드가 할당됩니다. T에서 선언 한 정적 필드가 사용되며 해당 필드는 상수 변수가 아닙니다 (§4.12.4). T는 최상위 클래스 (§7.6)이며 T (§8.1.3) 내에 어휘 적으로 중첩 된 assert 문 (§14.10)이 실행됩니다.
따라서 정적 이니셜 라이저 블록이 자동으로 실행되도록하려면 이러한 옵션 중 하나를 강제로 실행해야합니다.
예, 클래스가로드되면 정적 초기화 프로그램이 실행됩니다. 이는 일반적으로 처음으로 클래스 로딩 컨텍스트의 클래스에 액세스 할 때 발생합니다.
b.jar에서 메인 메소드 클래스는 해당 StaticClass를 확장 한 다음 자동으로 해당 정적 블록과 init ()가 호출됩니다.
더 추가 :
jvm이 클래스를로드 할 때 정적 블록이 실행됩니다.
여기 귀하의 예제에서 클래스를 intantiating init()
하여 메소드를 호출 할 수 있습니다.StaticClass
같은 StaticClass staticClass = new StaticClass ();
또는
StaticClass.class.newInstance();
이것은 더 선호합니다
참고 URL : https://stackoverflow.com/questions/9130461/when-is-the-static-block-of-a-class-executed
'developer tip' 카테고리의 다른 글
Log4J : 로거 인스턴스 생성 전략 (0) | 2020.11.05 |
---|---|
? #iefix는 IE6-IE8에서로드되는 웹 글꼴을 어떻게 해결합니까? (0) | 2020.11.05 |
OS X El Capitan의 "제한된"폴더 / 파일 (0) | 2020.11.05 |
인덱스 속성을 MOQ하는 방법 (0) | 2020.11.05 |
PHP 세션이 하위 도메인으로 전달되도록 허용 (0) | 2020.11.05 |