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

Java ClassLoader 與 Package 機制深度解析:安全邊界的守護者

     編輯:Java 相關知識

引人入勝的實驗

package java.lang;
public class Test {
    public static void main(String[] args) {
        char[] c = "1234567890".toCharArray();
        String s = new String(0, 10, c); // 調用 String package-private 構造器
    }
}

編譯通過,運行拋出 SecurityException: Prohibited package name: java.lang。為什麼同包卻不能訪問 package-private 成員?

ClassLoader 層級與雙親委派

JVM 內建四級加載器 (優先級遞減):

  1. 啟動類加載器 (Bootstrap):C++ 實現,載入 JAVA_HOME/lib/rt.jar 核心庫。
  2. 擴展類加載器 (Extension):載入 JAVA_HOME/lib/ext 或 java.ext.dirs 目錄下 JAR。
  3. 應用類加載器 (Application/System):載入 classpath 指定路徑類。
  4. 自定義類加載器:用戶繼承 ClassLoader 實現 (網絡、加密、熱插拔)。

雙親委派模型:收到載入請求 → 委派給父加載器 → 父無法載入 → 子自行載入。
核心保護:java.lang.String 由 Bootstrap 載入,自定義 java.lang.Test 由 Application 載入,**不同加載器載入的類即使同包也無法互訪 package-private 成員**,有效防止惡意代碼竊取核心類內部結構。

Package 權限的真實規則

只有同一 ClassLoader 載入的類之間,才享有 package-private 互訪權限。
這是 Java 安全沙箱的基石:核心類與應用類物理隔離在不同命名空間 (ClassLoader + 包名)。

實戰啟示

  • 不要嘗試定義 java.*/javax.* 包類,會被 Bootstrap/Extension 拒載或拋安全異常。
  • 熱部署、插件系統、模塊化 (JPMS) 均依賴自定義 ClassLoader 隔離命名空間。
  • 排查 ClassCastException/LinkageError 時,檢查類是否被多加載器重複載入。

總結

ClassLoader 不僅是類載入器,更是**安全邊界劃分器**。雙親委派 + 命名空間隔離,構建了 Java 獨特的運行時安全模型。

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