類加載機制:全盤負責和雙親委託

原文鏈接:https://blog.csdn.net/zhangzeyuaaa/article/details/42499839

全盤負責

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

例如:系統類加載器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) 方法。

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