乍一看到ClassLoader,我的第一感覺就是這東西好神秘啊。然后找了一下資料,略懂了一點(diǎn)皮毛,然后在這里和大家分享一下,這篇文章在接下來的日子里會(huì)不斷的被更新,希望會(huì)越來越完善。
首先,我們了解一下ClassLoader是干什么用的呢?
大家都知道,JVM解析的是Class的字節(jié)碼文件,那么JVM怎樣來加載這個(gè)字節(jié)碼文件呢,沒錯(cuò),ClassLoader負(fù)責(zé)了這項(xiàng)重要的工作。
JDK中主要有以下幾種ClassLoader:
a, Bootstrap ClassLoader/啟動(dòng)類加載器
主要負(fù)責(zé)jdk_home/lib目錄下的核心 api 或 -Xbootclasspath 選項(xiàng)指定的jar包裝入工作.
b, Extension ClassLoader/擴(kuò)展類加載器
主要負(fù)責(zé)jdk_home/lib/ext目錄下的jar包或 -Djava.ext.dirs 指定目錄下的jar包裝入工作
c, System ClassLoader/系統(tǒng)類加載器
主要負(fù)責(zé)java -classpath/-Djava.class.path所指的目錄下的類與jar包裝入工作.
b, User Custom ClassLoader/用戶自定義類加載器(java.lang.ClassLoader的子類)
在程序運(yùn)行期間, 通過java.lang.ClassLoader的子類動(dòng)態(tài)加載class文件, 體現(xiàn)java動(dòng)態(tài)實(shí)時(shí)類裝入特性.
那么我們能用ClassLoader做什么事情呢?
如果我們想動(dòng)態(tài)的加載一個(gè)類,比如我們想實(shí)現(xiàn)一個(gè)Hot-Swap的應(yīng)用,我們期望一個(gè)剛開發(fā)的高版本的Class在不關(guān)閉JVM的情況下讓它工作,此時(shí)我們就可以實(shí)現(xiàn)我們自己的ClassLoader,重寫里面的findClass方法。
這里我們需要注意ClassLoader的雙親委托模式,即定義ClassLoader加載一個(gè)類之前,要先委托它的父親ClassLoader進(jìn)行加載,只有當(dāng)父親ClassLoader無法加載成功后,才會(huì)由自己加載。為什么要使用這種雙親委托模式呢?
第一個(gè)原因就是因?yàn)檫@樣可以避免重復(fù)加載,當(dāng)父親已經(jīng)加載了該類的時(shí)候,就沒有必要子ClassLoader再加載一次。
第二個(gè)原因就是考慮到安全因素,我們?cè)囅胍幌拢绻皇褂眠@種委托模式,那我們就可以隨時(shí)使用自定義的String來動(dòng)態(tài)替代java核心api中定義類型,這樣會(huì)存在非常大的安全隱患,而雙親委托的方式,就可以避免這種情況,因?yàn)镾tring已經(jīng)在啟動(dòng)時(shí)被加載,所以用戶自定義的ClassLoader 無法加載另外的String。
參考資料:
http://www.iteye.com/topic/136427
http://www.iteye.com/topic/83978
Kyle Wang