developer tip

클래스의 정적 블록은 언제 실행됩니까?

optionbox 2020. 11. 5. 07:56
반응형

클래스의 정적 블록은 언제 실행됩니까?


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에 의해로드되지 않았기 때문에 누군가가 나에게 말할 수 있다고 생각합니다.

  1. 내 결론이 맞습니까?
  2. jvm이 클래스를로드하도록 트리거하는 것은 무엇입니까?
  3. 정적 블록을 자동으로 실행하려면 어떻게해야합니까?

감사


그래 네가 맞아. 정적 초기화 블록은 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

    반응형