.class がクラス内の静的ブロックを呼び出さないのはなぜですか? 質問する

.class がクラス内の静的ブロックを呼び出さないのはなぜですか? 質問する

これは私が持っているコードです:

public class StupidClass {
    static {
        System.out.println("Stupid class loaded!");
    }
}

私が実行しているテストは別々に

import org.junit.Test;

public class StupidTest {
    @Test
    public void foo() throws ClassNotFoundException {
        final Class<?> stupidClass = Class.forName("StupidClass");
        System.out.println(stupidClass.getSimpleName());
    }

    @Test
    public void bar() throws ClassNotFoundException {
        final Class<StupidClass> stupidClassClass = StupidClass.class;
        System.out.println(stupidClassClass.getSimpleName());
    }
}

テストを実行するとフー私は見ます:

Stupid class loaded!
StupidClass

しかしテストを実行するとバー私が見ているのは:

StupidClass

引用元これページ..

クラス オブジェクトは、クラスがロードされるとき、およびクラス ローダーの defineClass メソッドの呼び出しによって、Java 仮想マシンによって自動的に構築されます。

つまり、私の理解では、テスト バーでは、愚かなクラスがロードされます。そうでなければ、null が表示されると思います。つまり、クラス自体がロードされるため、クラス オブジェクトが作成されます。

さて、引用しますこれページ

静的初期化ブロックは、JVM (具体的にはクラス ローダー) が StaticClass をロードするときに実行されます (コード内で初めて参照されるときに発生します)。

したがって、テスト バーにも「愚かなクラスがロードされました!」というテキストが表示されることを期待していましたが、表示されませんでした。

以下からも引用Javaで考える

Candy、Gum、Cookie の各クラスには、クラスが初めてロードされるときに実行される静的句があります。

あまり正確ではないようです。

何が足りないのでしょうか?

ベストアンサー1

静的初期化ブロックは、JVM (具体的にはクラス ローダー) が StaticClass をロードするときに実行されます (コード内で初めて参照されるときに発生します)。

上記の引用は明らかに間違っていますが、これは非常に広まっている誤解の一例にすぎません。

  1. クラス初期化されていませんロードされるときですが、静的クラスの場合メンバー最初に参照される。これは正確には仕様

  2. クラスの読み込み発生しないクラスが最初に参照されるときですが、実装に依存するポイントです。

  3. クラスをロードする必要がある最後の瞬間は、クラスが参照されるときであり、同じではありませんクラスを参照するものとしてメンバー

Class.forNameboolean initializeはデフォルトでクラスを初期化しますが、 を受け取り、 を提供するオーバーロードを呼び出すこともできますfalse。初期化せずにクラスがロードされます。

おすすめ記事