Java 類載入器是 JVM 動態特性的核心基石。本文將系統介紹類載入器的分類、雙親委派模型運作機制、命名空間概念,並釐清學習過程中常見的混淆點,幫助開發者建立扎實的 JVM 基礎認知。
顧名思義,類載入器負責將 .class 字節碼文件載入 JVM 內存中。JVM 規範定義了兩大類載入器:
java.lang.* 等核心類庫(如 java.lang.Object)。java.lang.ClassLoader。其中 系統類載入器 是一個特殊的實例,由 JVM 實現者提供,默認載入應用程序類路徑下的類,可通過 ClassLoader.getSystemClassLoader() 獲取。以下代碼演示如何打印當前 JVM 的類載入器鏈路:
public class LoaderSample1 {
public static void main(String[] args) {
ClassLoader cl = ClassLoader.getSystemClassLoader();
System.out.println(cl);
while (cl != null) {
cl = cl.getParent();
System.out.println(cl);
}
try {
Class c = Class.forName("java.lang.Object");
System.out.println("java.lang.Object's loader is " + c.getClassLoader());
c = Class.forName("LoaderSample1");
System.out.println("LoaderSample1's loader is " + c.getClassLoader());
} catch (Exception e) {
e.printStackTrace();
}
}
}
典型輸出(Sun Java 1.5):
sun.misc.Launcher$AppClassLoader@82ba41 // 系統類載入器
sun.misc.Launcher$ExtClassLoader@923e30 // 擴展類載入器
null // 啟動類載入器
java.lang.Object's loader is null // 核心類由啟動類載入器載入
LoaderSample1's loader is sun.misc.Launcher$AppClassLoader@82ba41 // 用戶類由系統類載入器載入
自 JDK 1.2 起,Java 引入雙親委派模型以保障平台安全。核心邏輯:當類載入器收到載入請求,優先委派給父載入器;父載入器無法完成時,子載入器才嘗試自行載入。
假設載入器鏈路為 Loader2 → Loader1 → System ClassLoader,請求載入 MyClass:
Loader2 委派 Loader1Loader1 委派系統類載入器Class 對象引用,層層返回Loader1 嘗試 → 失敗 → Loader2 嘗試ClassNotFoundExceptionClass 對象的所有載入器(含定義類載入器)雙親委派模型有效防止了核心類被惡意篡改(如自定義 java.lang.String),是 Java 安全體系的重要防線。