77

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

  1. 私の結論は正しいですか?
  2. jvmがクラスをロードするきっかけは何ですか?
  3. 静的ブロックを自動的に実行するにはどうすればよいですか?

ありがとう

4

9 に答える 9

94

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

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

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

于 2012-02-03T14:52:15.347 に答える
7

はい、あなたは正しいです。あなたはあなたを使用していないので、それはStaticClassvmによってロードされず、したがってinit()実行されることはありません。

2番目の質問では、おそらく難しい方法で、利用可能なすべてのクラスをスキャンしてロードする必要があります。

https://stackoverflow.com/a/3223019/393657

于 2012-02-03T14:51:25.300 に答える
5

まず第一に、クラスのロードはクラスの初期化とは異なります。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)が実行されます。
  • したがって、静的初期化ブロックを自動的に実行するには、これらのオプションの1つを強制的に実行する必要があります。

    于 2019-07-19T04:12:09.977 に答える
    4

    そうです、最も簡単な方法はクラスにアクセスすることです。たとえば、

    StaticClass.class.newInstance();

    またはあなたの主な方法でその点に何か。これにより、クラスがクラスローダーによって確実にロードされます。

    于 2012-02-03T14:50:34.630 に答える
    3

    StaticClass静的コードは、クラス(おそらく)が参照されるときに実行されます。

    したがって、の新しいインスタンスを作成する場合、StaticClassまたはその静的メソッドの1つを呼び出す場合は、実行する必要があります。

    于 2012-02-03T14:51:00.150 に答える
    3

    静的ブロックは、ロードされたクラスが最初に初期化または参照されるときに実行されます。クラスをロードすることは、クラスが初期化されることを意味しません。JVMクラスのロードは、別の懸念事項です。

    于 2016-11-09T05:30:27.083 に答える
    0

    はい、静的初期化子はクラスがロードされるときに実行されます。これは通常、クラス読み込みコンテキストでクラスに初めてアクセスするときに発生します。

    于 2012-02-03T14:51:32.213 に答える
    0

    b.jarのメインメソッドクラスはそのStaticClassを拡張する必要があり、その後自動的にその静的ブロックとinit()が呼び出されます

    于 2013-03-18T12:48:53.023 に答える
    -2

    さらに追加:

    静的ブロックは、jvmがクラスをロードするときに実行されます。

    ここであなたの例では、クラスをインスタンス化することによってinit()あなたのメソッドを呼び出すことができますStaticClass

    StaticClassのようにstaticClass=new StaticClass();

    また

    StaticClass.class.newInstance(); これはより好ましい

    于 2013-05-20T07:31:50.487 に答える