簡體   English   中英

Java如何找到已經加載的類?

[英]How does Java find already loaded classes?

我知道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實例。

現在的問題是,當第二行執行時,再次引用了Class A ,Java不會再次查找該類並返回相同的Class加載實例嗎?

正如Java類加載器文檔所述,每個類加載器都應維護已加載類的實例,並為下一次調用返回相同的實例。

Java在哪里保存加載的類? ClassLoader類具有一個Vector類,VM會調用該類來添加已加載的類。

也許這個問題有點令人困惑,基本上我正在嘗試找出從哪個方法返回已經加載的類。 我嘗試將調試點保留在loadClass()方法中,但Line 2未調用它。

ClassLoaderloadClass()方法具有findLoadedClass方法,但也不會被調用。

如果您想將對A的提及“翻譯”為任何方法調用,那么最接近的不是loadClass()而是Class.forName()

該方法調用向類加載器查詢類,這可能觸發也可能不會觸發類加載(並且調用者甚至不在乎)。 它將簡單地將一個完全加載的(並初始化,如果您不使用三參數版本的 )類返回給調用者。

並且一旦加載了類,使用該類時就不再調用該類加載器(顧名思義,一旦加載了該類,就完成了工作)。

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");
    }
}

Ans是:
回答截圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM