クラス・ローダーは、クラスが「アクティブに初めて使用される」のを待ってからそれをロードする必要はありません。JVM仕様では、クラス・ローダーは、クラスが使用されることが予想されるときに、事前ロード・プロセス中に検出された場合に、クラスを事前ロードできます。 .classファイルが見つからないかエラーがある場合、クラスローダーは、プログラムが初めてクラスをアクティブに使用するときにのみエラーを報告する必要があります(LinkageErrorエラー)クラスがプログラムによってアクティブに使用されていない場合、クラスローダーはエラーを報告しません
クラスに親クラスがあるか、関連するインターフェースが実装されている場合、対応する親クラスが最初に読み込まれるか、最初に接続されることは誰でも知っています。ただし、この状況に加えて、クラスもロードされる状況がいくつかあります。
仮想マシンのパラメーターを追加します:-verbose:class
最初のケース:メソッドを呼び出す、呼び出しメソッドはクラスを使用します
パブリック クラスReloadTest { public static void main(String [] args){ System.out.println( "---------- Start to execute the main method ----------" ); // テストメソッドを呼び出してPrintTestクラス testの使用を開始します(); } public static void test(){ System.out.println(。PrintTest クラス.getClass()); } }
しかし、この場合、このクラスはロードされません
mainメソッドは何もしない、つまりPrintTestクラスを使用せず、もちろんこのクラスをロードしません
パブリック クラスReloadTest { static { System.out.println( "------------ Start to execute static code block ----------" ); } public static void main(String [] args){ } public static void test(){ System.out.println(PrintTest。クラス); } }
2番目のケース:メソッドの戻り値の型としてのPrintTestクラス
パブリック クラスReloadTest { static { System.out.println( "------------ Start to execute static code block ----------" ); } public static void main(String [] args){ } public PrintTest test(){ nullを返す ; } }
コンソール出力を見てください: