ClassLoader專(zhuān)題(一):ClassLoader基礎(chǔ)
ClassLoader 專(zhuān)題(一): ClassLoader 基礎(chǔ)
ClassLoader 專(zhuān)題(二):從 Servlet 容器看 ClassLoader 機(jī)制的妙用
ClassLoader專(zhuān)題(三):引文
JVM啟動(dòng),會(huì)形成3個(gè)類(lèi)加載器組成的初始化加載器層次結(jié)構(gòu):
bootstap classloader (加載核心類(lèi))
||
extension classloader(加載ext(目錄),即java.ext.dirs())
||
system classloader (加載-classpath或者java.class.path或者CLASSPATH)
ClassLoader機(jī)制:
a)全盤(pán)負(fù)責(zé):一個(gè)classloader加載一個(gè)class后,這個(gè)class所引用或者依賴(lài)的類(lèi)也由這個(gè)classloader載入,除非顯示的用另一個(gè)classloader載入
b)委托機(jī)制:先由父加載器加載,除非父加載器找不到時(shí)才從自己的類(lèi)路徑中去尋找
c)Cache機(jī)制:classloader采用緩存機(jī)制,即先查cache;若cache中保存了這個(gè)class就直接返回;若無(wú),才從文件讀取和轉(zhuǎn)化為class并放入cache
ClassLoader加載類(lèi)順序:
1)檢查cache是否有該類(lèi):
11)若有直接返回
12)若無(wú),請(qǐng)求父類(lèi)加載
121) 若無(wú)父,則從bootstap classloader加載
2)加載:
21)尋找class文件(叢與此classloader相關(guān)的類(lèi)路徑中尋找)
22)從文件載入class
23)找不到則拋出ClassNotFoundeException
3)擴(kuò)展:
記載時(shí)即2),覆寫(xiě)findClass可以實(shí)現(xiàn)自己的載入策略
記載時(shí)即2),覆寫(xiě)loadClass來(lái)實(shí)現(xiàn)自己的載入過(guò)程
如何實(shí)現(xiàn)運(yùn)行時(shí)動(dòng)態(tài)載入與更新
本質(zhì):只要?jiǎng)討B(tài)改類(lèi)搜索路徑和清除classloader的cache已載入的class就ok
做法:
1)繼承ClassLoader:覆寫(xiě)loadClass方法,動(dòng)態(tài)尋找class文件
2)只要重新使用一個(gè)新的類(lèi)搜索路徑來(lái)new一個(gè)classloader就可以,這樣既更新了類(lèi)的搜索路徑以便來(lái)載入新的class,也更新生成了一個(gè)空白的cache
classloader載入的方式
1)Pre-loading 預(yù)先載入,載入基礎(chǔ)類(lèi)
2)load-on-demand 按需求載入
JDK為啥有兩個(gè)JRE?
JDK中jre是運(yùn)行java本身的程序,如javac
ProgramFile(默認(rèn)安裝)中jre是運(yùn)行用戶編寫(xiě)的java程序
posted on 2007-02-01 20:48 crazycy 閱讀(5095) 評(píng)論(5) 編輯 收藏 所屬分類(lèi): JavaSE語(yǔ)言