JVM 啟動時建立三大核心類加載器,呈樹狀父子關係:
| 加載器 | 類型 | 加載範圍 | 備註 |
|---|---|---|---|
| Bootstrap ClassLoader | C++ 實現(非 Java 類) | JRE/lib/rt.jar 核心類庫(java.*, javax.*) | 無父加載器,getClassLoader() 回傳 null |
| Extension ClassLoader | Java 類(ExtClassLoader) | JRE/lib/ext/*.jar 擴展庫 | 父加載器為 Bootstrap |
| Application ClassLoader | Java 類(AppClassLoader) | 用戶 classpath 指定的所有類/目錄 | 父加載器為 Extension,預設系統加載器 |
public class Test1 {
public static void main(String[] args) {
System.out.println(Test1.class.getClassLoader().getClass().getName()); // sun.misc.Launcher$AppClassLoader
System.out.println(System.class.getClassLoader()); // null (Bootstrap)
ClassLoader cl = Test1.class.getClassLoader();
while (cl != null) {
System.out.println(cl.getClass().getName());
cl = cl.getParent();
}
System.out.println(cl); // 最後印出 null (Bootstrap)
}
}
輸出結果:
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
null

ClassNotFoundExceptionjava.lang.String)只由 Bootstrap 載入一次,防止惡意代碼偽裝核心類DriverManager,需透過 Thread.currentThread().getContextClassLoader() 反向載入用戶實現的 DriverWebappClassLoader,優先自載,再委派父加載器(違背標準委派)