關(guān)于java class loader的理解筆記
Posted on 2007-04-03 12:27 久城 閱讀(2539) 評(píng)論(3) 編輯 收藏 所屬分類: Java理解筆記JAVA中的一切都是以類的形式存在的(除少數(shù)底層的東西,那些我就不清楚是怎么回事了)。我們運(yùn)行的接口是一個(gè)類,運(yùn)行中所涉及到的對(duì)象也都是類對(duì)象。下面,我們來(lái)研究下,我所理解的類的加載機(jī)制。
比如我們有一個(gè)Student類,也就是經(jīng)過(guò)編譯后,是一個(gè)Student.class文件。當(dāng)我們的程序運(yùn)行的過(guò)程中,第一次實(shí)例化一個(gè)student對(duì)象的時(shí)候,系統(tǒng)首先要做的就是加載Student這個(gè)類。也就是把Student.class以字節(jié)瑪?shù)男蝿?shì)加載到內(nèi)存中(并通過(guò)defineClass()這個(gè)方法轉(zhuǎn)變成Class對(duì)象,最終以Class對(duì)象的形式存儲(chǔ)在內(nèi)存中)。這個(gè)加載的過(guò)程就是由類加載器來(lái)完成的。
一般的,在程序啟動(dòng)之后,系統(tǒng)會(huì)主要會(huì)有三個(gè)類加載器:Bootstrap Loader、ExtClassLoader與AppClassLoader。
Bootstrap Loader是由C++撰寫(xiě)的,它主要負(fù)責(zé)搜索JRE所在目錄的classes或lib目錄下的.jar文件(例如rt.jar)是否需要被加載(實(shí)際上是由系統(tǒng)參數(shù)sun.boot.class.path來(lái)指定);ExtClassLoader主要負(fù)責(zé)搜索JRE所在目錄的lib/ext 目錄下的classes或.jar中是否需要被加載(實(shí)際上是由系統(tǒng)參數(shù)java.ext.dirs指定);AppClassLoader則是搜索 Classpath中是否有指定的classes需要被載入(由系統(tǒng)參數(shù)java.class.path指定)。
簡(jiǎn)單的說(shuō),Bootstrap Loader、ExtClassLoader這兩個(gè)類加載器,主要是加載系統(tǒng)類庫(kù)里的類。我們自己編輯的類一般都是由AppClassLoader來(lái)加載。當(dāng)我們遇到如下代碼的時(shí)候:


AppClassLoader首先會(huì)到classpath下去尋找Student.class文件。(找不到則會(huì)拋出ClassNotFoundException異常)找到之后便會(huì)把Student這個(gè)類以二進(jìn)制的形式存儲(chǔ)到內(nèi)存中。這個(gè)過(guò)程也就是對(duì)Student類加載的過(guò)程。然后用我們加載到內(nèi)存中的Student類去實(shí)例化一個(gè)Student對(duì)象stu。
以上就是所謂的隱式的類的加載過(guò)程。但是有些時(shí)候需要我們自定義一個(gè)類的加載器,這個(gè)時(shí)候就需要我們模仿這個(gè)過(guò)程,顯示的加載我們自己所需要的類。比如,我們自定義一個(gè)類的加載器MyClassLoader,那我們利用我們自定義的這個(gè)加載器,顯示的去加載一個(gè)類的過(guò)程也是這樣的:
1.尋找類文件。
這里的靈活性比較大,我們可以自己去設(shè)計(jì)如何去尋找類文件以及去哪里尋找類文件。比如一些非本地的類文件,通過(guò)系統(tǒng)的類加載器無(wú)法加載到這些類,這個(gè)時(shí)候,我們就可以利用自定義的類加載器指定路徑去尋找。
2.加載類文件。
找到我們所要加載的類之后,通過(guò)MyClassLoader的defineClass()方法,把這個(gè)類加載到指定的內(nèi)存中。這里我們可以自己設(shè)定存儲(chǔ)類的內(nèi)存空間,比如把我們加載的類都統(tǒng)一放到一個(gè)變量數(shù)組里(至于系統(tǒng)的類加載到內(nèi)存中是以什么樣的形式存儲(chǔ)再內(nèi)存中的,我還不清楚,只知道是以二進(jìn)制的形式保存的,可以用一個(gè)Class對(duì)象去引用)。
3.創(chuàng)建類對(duì)象。
我接觸的時(shí)候還不大理解,其實(shí)這里是應(yīng)用我們自己加載到內(nèi)存中的類,去實(shí)例化一個(gè)對(duì)象。以下代碼可以參考:






















正在學(xué)習(xí)中,理解的還不夠準(zhǔn)確。保持更新。
歡迎來(lái)訪!^.^!
本BLOG僅用于個(gè)人學(xué)習(xí)交流!
目的在于記錄個(gè)人成長(zhǎng).
所有文字均屬于個(gè)人理解.
如有錯(cuò)誤,望多多指教!不勝感激!