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