隱式載入: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 ...