首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 類加載機制:為何無法覆蓋 JDK 核心類(如 String)

     編輯:程式設計疑難解答

雙親委派模型與沙箱安全機制深度解析

嘗試自定義 java.lang.String 類會發現:編譯雖通過,但運行時拋出 SecurityException 或直接加載系統類。這是 Java 類加載器雙親委派模型 與 沙箱安全機制 共同作用的結果。

雙親委派模型工作流程


自定義類加載器 (CustomClassLoader)
        ↑ 委派
擴展類加載器 (ExtensionClassLoader)  ← 加載 jre/lib/ext/*.jar
        ↑ 委派
啟動類加載器 (BootstrapClassLoader)  ← 加載 rt.jar 核心類庫 (String, Object 等)

加載 java.lang.String 時的具體過程

  1. 應用啟動,請求加載 java.lang.String
  2. 請求傳遞至 BootstrapClassLoader(頂層)
  3. BootstrapClassLoader 在 rt.jar 中找到系統 String 類
  4. 直接返回系統類的 Class 對象,**不再向下委派給自定義加載器**
  5. 自定義 String.class 永遠不會被加載

安全機制雙重保障

  • 包封裝檢查:JVM 規定 java.*、javax.* 等包只能由啟動類加載器加載,其他加載器嘗試定義這些包的類會拋出 SecurityException
  • 簽名驗證:核心類庫經過 Oracle 簽名,運行時驗證完整性,防止篡改
  • 訪問控制:SecurityManager 可限制類加載權限

破解嘗試與後果

嘗試方式結果原因
自定義類加載器加載同名類加載系統類雙親委派優先委派給啟動類加載器
打破雙親委派(重寫 loadClass)SecurityExceptionJVM 禁止非啟動類加載器定義 java.* 包類
-Xbootclasspath/p 強制替換可行但極危險繞過類加載器,直接替換啟動類路徑,破壞兼容性

正確的擴展方式

  • 組合/裝飾模式:public class MyString { private String delegate; ... }
  • 工具類靜態方法:StringUtils、StringHelper
  • Kotlin 擴展函數:fun String.myMethod() { ... }(編譯期語法糖,無運行時影響)

雙親委派模型不僅保證了核心類庫的唯一性與安全性,也是 Java 模塊化、熱部署、隔離容器(如 Tomcat、OSGi)實現的基石。理解其原理,能避免踩坑並設計出更健壯的系統架構。

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