[英]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
未調用它。
ClassLoader
的loadClass()
方法具有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.