2011-12-23 5 views
7

静的メソッドのみのクラスがあるとします。クラスローダは、クラスをメモリにロードするときに、インポートされた各クラスをロードしますか?または、これからメソッドがアクセスする必要がある場合にのみ読み込みをロードしますか?classLoaderはいつ読み込みをロードしますか?

質問は、クラスがメモリにロードされるとき、またはいくつかのメソッドがそれらを使用する直前に、クラスローダーが読み込みを読み込むかどうかです。 最初のオプションであれば、私はおそらく私のUtilクラスのいくつかを、もっとの専門家に分ける必要があるでしょう。

答えて

14

私は次のようにあなたがそれをテストすることができると思います。

package pkg1; 

public class Test { 

    static { 
     System.out.println("Hello 111"); 
    } 

    public static void meth() { 
     System.out.println("Hello 222"); 
    } 
} 

テスト1:

package pkg2; 

import pkg1.Test; 

public class Tester {  

    public static void main(String... args) {     
     Test t;  
    }  
} 

何も出力しません。

テスト2:

package pkg2; 

import pkg1.Test; 

public class Tester {  

    public static void main(String... args) {     
     Test.meth();   
    } 

} 

プリント:

 
Hello 111 
Hello 222 

だから、あなたが輸入しているという理由だけでクラスローダを意味するのではなく、クラスがメモリにクラスをロードします。使用時に動的にロードされます。

2

私はクラスローダーについて多くのことを知っているとは言いませんが、インポートステートメントについて言えば、クラスローダーは無関係です。

インポートステートメントは、開発者が書き込まれるクラスで参照される各クラスの完全修飾名ではなく、短いクラス名を使用できるようにするためのみに存在します。コンパイラは、バイトコードの1行が作成される前に、これらのインポート文を非常に早い段階で使用して、参照されるクラスの名前を解決します。

1

一般に、レポート(つまりprintステートメント)を含むクラスファイルの先頭にある静的コードブロックは、特定のアプリケーションでロードがいつ発生するかを知るのに役立ちます。

動的クラス、内部静的クラス、またはクラスパスから動的にロードされるクラスのようなコーナーケースを処理する場合、これらのクラスは実際にはアプリケーション内で複数回読み込まれる可能性があるため注意が必要です。

+0

[複数回]の部分について[要出典] – meriton

関連する問題