ClassLoader of Java
乍一看到ClassLoader,我的第一感覺就是這東西好神秘啊。然后找了一下資料,略懂了一點皮毛,然后在這里和大家分享一下,這篇文章在接下來的日子里會不斷的被更新,希望會越來越完善。a, Bootstrap ClassLoader/啟動類加載器
主要負責jdk_home/lib目錄下的核心 api 或 -Xbootclasspath 選項指定的jar包裝入工作.
b, Extension ClassLoader/擴展類加載器
主要負責jdk_home/lib/ext目錄下的jar包或 -Djava.ext.dirs 指定目錄下的jar包裝入工作
c, System ClassLoader/系統類加載器
主要負責java -classpath/-Djava.class.path所指的目錄下的類與jar包裝入工作.
b, User Custom ClassLoader/用戶自定義類加載器(java.lang.ClassLoader的子類)
在程序運行期間, 通過java.lang.ClassLoader的子類動態加載class文件, 體現java動態實時類裝入特性.
那么我們能用ClassLoader做什么事情呢?
如果我們想動態的加載一個類,比如我們想實現一個Hot-Swap的應用,我們期望一個剛開發的高版本的Class在不關閉JVM的情況下讓它工作,此時我們就可以實現我們自己的ClassLoader,重寫里面的findClass方法。
這里我們需要注意ClassLoader的雙親委托模式,即定義ClassLoader加載一個類之前,要先委托它的父親ClassLoader進行加載,只有當父親ClassLoader無法加載成功后,才會由自己加載。為什么要使用這種雙親委托模式呢?
第一個原因就是因為這樣可以避免重復加載,當父親已經加載了該類的時候,就沒有必要子ClassLoader再加載一次。
第二個原因就是考慮到安全因素,我們試想一下,如果不使用這種委托模式,那我們就可以隨時使用自定義的String來動態替代java核心api中定義類型,這樣會存在非常大的安全隱患,而雙親委托的方式,就可以避免這種情況,因為String已經在啟動時被加載,所以用戶自定義的ClassLoader 無法加載另外的String。
參考資料:
http://www.iteye.com/topic/136427
http://www.iteye.com/topic/83978
posted on 2012-04-22 17:15 王樹東 閱讀(180) 評論(0) 編輯 收藏 所屬分類: Java Skills Learning and Sharing