目錄
- 一、說明
- 二、示例
-
- 三、啟動類加載器
- 四、擴展類加載器
- 五、應用程序類加載器
一、說明
- 1.jvm支持兩種類型的類加載器,分別是引導類加載器(bootstrap classloader)和自定義類加載器(user-defined classloader)
- 2.自定義類加載器一般指的是程序中由開發人員自定義的一類類加載器,java虛擬機規范卻沒有這么定義,而是將所有派生于抽象類classloader的類加載器都劃分為自定義類加載器
- 3.在程序中,最常見的類加載器有引導類加載器、擴展類加載器、系統類加載器和自定義類加載器,是包含關系,不是上下層關系,也不是父類的繼承關系
- 4.引導類加載器是c語言編寫實現的,代碼無法獲取到
二、示例
2.1 代碼
package com.learning.classloader;public class ClassLoaderLearning {public static void main(String[] args) {// 獲取系統類加載器ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();System.out.println(systemClassLoader);// 獲取其上層: 擴展類加載器ClassLoader extClassLoader = systemClassLoader.getParent();System.out.println(extClassLoader);// 試圖獲取其上層: 獲取不到引導類加載器ClassLoader bootstrapClassLoader = extClassLoader.getParent();System.out.println(bootstrapClassLoader);// 對于用戶自定義類型: 默認使用系統類加載器進行加載ClassLoader classLoader = ClassLoaderLearning.class.getClassLoader();System.out.println(classLoader);// String類型: 使用引導到加載器進行加載的,java的核心類庫都是使用引導類加載器進行加載的ClassLoader stringClassLoader = String.class.getClassLoader();System.out.println(stringClassLoader);}
}
2.2 截圖

三、啟動類加載器
- 1.又叫引導類加載器、bootstrap classloader
- 2.啟動類加載器使用c/c++語言實現的,嵌套在jvm內部
- 3.它用來加載java的核心庫(java_home/jre/lib/rt.jar、resources.jar或sun.boot.class.path路徑下的內容),用于提供jvm自身需要的類
- 4.并不繼承自java.lang.ClassLoader,沒有父加載器
- 5.加載擴展類和應用程序類加載器,并指定為他們的父類加載器
- 6.處于安全考慮,bootstrap啟動類加載器只加載包名為java、javax、sun等開頭的類
四、擴展類加載器
- 1.extension classloader
- 2.java語言編寫,由sun.misc.Launcher$ExtClassLoader實現
- 3.派生于ClassLoader類
- 4.父類加載器為啟動類加載器
- 5.從java.ext.dirs系統屬性所指定的目錄中加載類庫,或從jdk的安全目錄的jre/lib/ext子目錄(擴展目錄)下加載類庫。如果用戶創建的jar放在此目錄下,也會自動由擴展類加載器加載
五、應用程序類加載器
- 1.AppClassLoader
- 2.java語言編寫,由sun.misc.Launcher$AppClassLoader實現
- 3.派生于ClassLoader類
- 4.父類加載器為擴展類加載器
- 5.負責加載環境變量classpath或系統屬性java.class.path指定路徑下的類庫
- 6.該類加載是程序中默認的類加載器,一般來說,java應用的類都是由它來完成加載
- 7.通過ClassLoader$getSystemClassLoader()方法可以獲取到該類加載器