-------------- 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虛擬機纔會認爲他們時同一個類