1. ホーム
  2. java

クラスのスタティックブロックはいつ実行されるか?

2023-08-21 21:23:41

質問

2つのjarがあり、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の中にmainがあり、mainの中でinit()メソッドが呼ばれていると思うのですが、実際には呼ばれていません。私はそれがStaticClassがjvmによってロードされていないためであると思うが、誰か私に教えてください。

  1. 私の結論は正しいですか?
  2. jvmがクラスをロードするトリガーは何ですか?
  3. 静的ブロックを自動的に実行させるにはどうしたらよいですか?

ありがとうございます。

どのように解決するのですか?

はい、あなたは正しいです。静的初期化ブロックは、JVM(クラスローダー - 具体的には) が StaticClass をロードするときに実行されます (これは、それがコード内で最初に参照されるときに発生します)。

このメソッドを強制的に呼び出すには、明示的に StaticClass.init() これはJVMに依存するよりも望ましいことです。

を使ってみることもできます。 Class.forName(String) を使用して、JVMにクラスをロードさせ、その静的ブロックを呼び出すように強制することもできます。