2

Java は ClassLoader 階層を使用してクラスをロードすることを知っています。

たとえば、プログラム:

public void test(){
    A a = new A(); // Line 1 The class is accessed first time here so it should be loaded and defined

    A ab = new A(); //Line 2 How can the second line be represented?
}

コードの最初の行は次のようになります

Thread.currentThread().getContextClassLoader().loadClass("A");

したがって、クラスがロードされ、のインスタンスを作成するように定義されますClass

問題は、2 行目が実行され、Class A再び参照されるときです。Java はクラスを再度検索せず、ロードされたクラスの同じインスタンスを返しますか?

Java クラスローダ ドキュメントにあるように、すべてのクラス ローダはロードされたクラスのインスタンスを保持し、次の呼び出しで同じインスタンスを返す必要があります。

Java はロードされたクラスをどこに保持しますか? ClassLoaderclass にはVector、ロードされたクラスを追加するために VM によって呼び出されるクラスがあります。

質問は少し混乱しているかもしれません。基本的に、既にロードされているクラスがどのメソッドから返されるかを理解しようとしています。loadClass()メソッドにデバッグ ポイントを保持しようとしましたが、 Line 2.

loadClass()メソッドにClassLoaderfindLoadedClassメソッドがありますが、それも呼び出されません。

4

2 に答える 2

1
package java_language;

public class NewClass {

    Java_language j;
    
    public NewClass() throws ClassNotFoundException {
        j=new Java_language();
         if (Class.forName("java_language.Java_language", true, Thread.currentThread().getContextClassLoader()).equals(j.getClass())) {
            System.out.println("CLass has been loaded");
        }
    }

    public static void main(String[] args) throws ClassNotFoundException {
       new NewClass();
        
    }

}

package java_language;

public class Java_language {

    static Java_language java_language = null;
    public Java_language() {
        System.out.println("Stack Overflow");
    }
}

答え: ここに画像の説明を入力してください

于 2017-07-07T09:29:58.570 に答える