首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 類載入器與雙親委派模型深度解析

     編輯:Java 程式設計入門

Java 類載入器是 JVM 動態特性的核心基石。本文將系統介紹類載入器的分類、雙親委派模型運作機制、命名空間概念,並釐清學習過程中常見的混淆點,幫助開發者建立扎實的 JVM 基礎認知。

類載入器的功能與分類

顧名思義,類載入器負責將 .class 字節碼文件載入 JVM 內存中。JVM 規範定義了兩大類載入器:

  • 啟動類載入器:由 C++ 實現,屬於 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:

  1. Loader2 委派 Loader1
  2. Loader1 委派系統類載入器
  3. 系統類載入器成功 → 返回 Class 對象引用,層層返回
  4. 系統類載入器失敗 → Loader1 嘗試 → 失敗 → Loader2 嘗試
  5. 全部失敗 → 拋出 ClassNotFoundException

關鍵術語

  • 定義類載入器:實際完成類載入動作的載入器
  • 初始類載入器:能成功返回 Class 對象的所有載入器(含定義類載入器)

雙親委派模型有效防止了核心類被惡意篡改(如自定義 java.lang.String),是 Java 安全體系的重要防線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved