jvm類加載-全盤負責和雙親委派機制

“全盤負責”是指當一個ClassLoader裝載一個類時,除非顯示地使用另一個ClassLoader,則該類所依賴及引用的類也由這個CladdLoader載入。

例如,系統類加載器AppClassLoader加載入口類(含有main方法的類)時,會把main方法所依賴的類及引用的類也載入,依此類推。“全盤負責”機制也可稱爲當前類加載器負責機制。顯然,入口類所依賴的類及引用的類的當前類加載器就是入口類的類加載器。

以上步驟只是調用了ClassLoader.loadClass(name)方法,並沒有真正定義類。真正加載class字節碼文件生成Class對象由“雙親委派”機制完成。

“雙親委派”是指子類加載器如果沒有加載過該目標類,就先委託父類加載器加載該目標類,只有在父類加載器找不到字節碼文件的情況下才從自己的類路徑中查找並裝載目標類。

“雙親委派”機制加載Class的具體過程是:

  1. 源ClassLoader先判斷該Class是否已加載,如果已加載,則返回Class對象;如果沒有則委託給父類加載器。
  2. 父類加載器判斷是否加載過該Class,如果已加載,則返回Class對象;如果沒有則委託給祖父類加載器。
  3. 依此類推,直到始祖類加載器(引用類加載器)。
  4. 始祖類加載器判斷是否加載過該Class,如果已加載,則返回Class對象;如果沒有則嘗試從其對應的類路徑下尋找class字節碼文件並載入。如果載入成功,則返回Class對象;如果載入失敗,則委託給始祖類加載器的子類加載器。
  5. 始祖類加載器的子類加載器嘗試從其對應的類路徑下尋找class字節碼文件並載入。如果載入成功,則返回Class對象;如果載入失敗,則委託給始祖類加載器的孫類加載器。
  6. 依此類推,直到源ClassLoader。
  7. 源ClassLoader嘗試從其對應的類路徑下尋找class字節碼文件並載入。如果載入成功,則返回Class對象;如果載入失敗,源ClassLoader不會再委託其子類加載器,而是拋出異常。

“雙親委派”機制只是Java推薦的機制,並不是強制的機制。

我們可以繼承java.lang.ClassLoader類,實現自己的類加載器。如果想保持雙親委派模型,就應該重寫findClass(name)方法;如果想破壞雙親委派模型,可以重寫loadClass(name)方法。

參考:瘋狂java講義

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章