loadClass和forName的區別

2021-10-02 16:01:03 字數 1952 閱讀 3368

隱式載入:new

顯示載入:loadclass,forname等

讓我們直接幹進原始碼!!

loadclass

public class<

?>

loadclass

(string name)

throws classnotfoundexception

protected class<

?>

loadclass

(string name,

boolean resolve)

throws classnotfoundexception

else

}catch

(classnotfoundexception e)

if(c == null)}if

(resolve)

return c;

}}

loadclass主要還是看 classload類裡的loadclass方法,

讓我們看看第二個引數 resolve的解釋

意思是是否要 鏈結 這個類,如果為true會進入到 resolveclass這個方法,然後找到該方法的注釋,第一句話就是鏈結指定的類!

同樣直接幹進原始碼

public

static class<

?>

forname

(string classname)

throws classnotfoundexception

這裡看 forname0 的第二個引數 initialize 意為是否初始化。

以上說明:

1.classloader.loadclass得到的class是還沒有鏈結的,只完成了 上圖中的第一步

2.class.forname得到的class是已經初始化完成的,已經完成到了上圖中的第三步

什麼?你不相信?好吧,那我們用**來說話

以robot為例

若能列印出 靜態塊裡的**,說明已經完成初始化

public

class

robot

}

public

class

loaddifference

}

輸出

為空接下來換成forname

public

class

loaddifference

}

輸出

所以很好的證明了以上的結論。

class.forname已經初始化,那為什麼還要用loadclass呢?

loadclass在springioc中資源載入器獲取要讀入的資源的時候,即讀取一些bean的配置檔案的時候,如果是以classpath方式來載入的話就需要使用classload.loadclass來載入,之所以這樣做是和springioc的lazy-loading(懶載入)有關,springioc為了加快初始化速度因此大量使用延遲載入技術,而使用classload不需要執行類中的初始化**(static)步驟和鏈結步驟,這樣做可以加快載入速度,把類的初始化工作留到實際使用到這個類的時候才去做。

CI框架load class方法分析

load class 這個方法是乙個實現了註冊模式的典型方法 它可以傳入3個引數,類名,類的存放位址,例項化時候需要傳入的引數 static classes array 設定靜態變數為乙個陣列,用來存放已經全部例項化過的類,static只會初始化一次,而且這個變數只會在當前函式中存在 does th...

關於類載入的loadClass 方法的講解

loadclass 方法是classloader類中的乙個方法 protected class loadclass string name,boolean resolve throws classnotfoundexception else catch classnotfoundexception ...

和 區別和聯絡, 和 區別和聯絡

和 區別和聯絡,和 區別和聯絡,實際專案中,什麼情況用哪種?首先,和 的聯絡 共同點 和 都可以用作 邏輯與 運算子,都是雙目運算子。具體要看使用時的具體條件來決定。無論使用哪種運算子,對最終的運算結果都沒有影響。情況1 當上述的運算元是boolean型別變數時,和 都可以用作邏輯與運算子。情況2 ...