java 中的類加載器

-------------- Android 進階解密筆記—類加載器 -------------------------

ClassLoader的類型(兩種)

  • 系統類加載器
  • 自定義類加載器

系統類加載器(三種)

  • Bootstrap ClassLoader (引導類加載器)
  • Extensions ClassLoader (拓展類加載器)
  • Application ClassLoader (應用程序類加載器)

Bootstrap ClassLoader (引導類加載器)

C/C++ 代碼實現的加載器,用於加載指定的JDK 的核心類庫,用來加載以下目錄類庫

  • $JAVA_HOME/jre/lib 目錄
  • Xbootclasspath 參數指定的目錄

Extensions ClassLoader (拓展類加載器)

JAVA 中的實現類爲ExtClassLoader ,因此可以簡稱爲ExtClassLoader,它用於加載java的拓展類,提供除了系統類之外的額外功能,ExtClassLoader用來加載一下目錄中的類庫

  • 加載 $JAVA_HOME/jre/lib/ext 目錄
  • 系統屬性java.ext.dir 所指定的目錄

Application ClassLoader (應用程序類加載器)

java 中的實現類爲AppClassLoader,因此可以簡稱爲AppClassLoader,同時它又可以稱作System ClassLoader(系統類加載器),這是因爲AppClassLoader可以通過ClassLoader的getSystemClassLoader方法獲取到,它用來加載一下目錄中的類庫

  • 當前程序的Classpath 目錄
  • 系統屬性java.class.path 指定的目錄

Custom ClassLoader(自定義類加載器)

除了系統提供的類加載器,還可以自定義類加載器,自定義類加載器通過集成java.lang.ClassLoader 類的方式來實現自己的類加載器,Extensions ClassLoader 和 AppClassLoader 也繼承了java.lang.ClassLoader類

ClassLoader 繼承關係

先看張結果圖
在這裏插入圖片描述

  • ClassLoader 是一個抽象類,其中定義了ClassLoader的主要功能
  • SecureClassLoader 繼承了抽象類ClassLoader ,但SecureClassLoader並不是ClassLoader的實現類,而是拓展了ClassLoader類加入了權限方面的功能,加強了ClassLoader 的安全性
  • URLClassLoader 繼承自SecureClassLoader,可以通過URL路徑從jar文件和文件夾中加載類和資源
  • ExtClassLoader 和 AppClassLoader 繼承自 URLClassLoader,他們都是Launcher 的內部類,Launcher是java虛擬機的入口應用,ExtClassLoader和 AppClassLoader 都是在Launcher 中進行初始化的

雙親委託模式

類加載器查找Class 所採用的是雙親委託模式,所謂雙親委託模式就是:

  • 首先判斷該類是否被加載
  • 如果沒有則不是自身去查找而是委託給父加載器進行查找
  • 直到委託到最頂層的Bootstrap ClassLoader ,如果Bootstrap ClassLoader 找到了該類,就直接返回
  • 如果沒有找到,則繼續一次向下查找
  • 如果還沒找到則最後會交個自身去查找

在這裏插入圖片描述

虛線的方向自下而 上進行委託,再沿着實線的方向自上而下進行查找和加載

雙親委託模式好處:
  • 避免重複加載,如果已經加載過一次Class,就不需要再次加載,而是直接讀取已經加載的Class
  • 更加安全,如果不使用雙親委託模式,就可以自定義一個String類來替代系統的String 類,這顯然會造成安全隱患,採用雙親委託模式會使得系統的String類在java虛擬機啓動時就被加載,也就無法自定義String類來代替系統的Sting 類,除非我們修改類加載器搜索類的默認算法,還有一點,只有兩個類名一致並且並且被同一個類加載器加載的類,java虛擬機纔會認爲他們時同一個類
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章