嘗試自定義 java.lang.String 類會發現:編譯雖通過,但運行時拋出 SecurityException 或直接加載系統類。這是 Java 類加載器雙親委派模型 與 沙箱安全機制 共同作用的結果。
自定義類加載器 (CustomClassLoader)
↑ 委派
擴展類加載器 (ExtensionClassLoader) ← 加載 jre/lib/ext/*.jar
↑ 委派
啟動類加載器 (BootstrapClassLoader) ← 加載 rt.jar 核心類庫 (String, Object 等)
java.lang.StringBootstrapClassLoader(頂層)BootstrapClassLoader 在 rt.jar 中找到系統 String 類Class 對象,**不再向下委派給自定義加載器**String.class 永遠不會被加載java.*、javax.* 等包只能由啟動類加載器加載,其他加載器嘗試定義這些包的類會拋出 SecurityExceptionSecurityManager 可限制類加載權限| 嘗試方式 | 結果 | 原因 |
|---|---|---|
| 自定義類加載器加載同名類 | 加載系統類 | 雙親委派優先委派給啟動類加載器 |
| 打破雙親委派(重寫 loadClass) | SecurityException | JVM 禁止非啟動類加載器定義 java.* 包類 |
| -Xbootclasspath/p 強制替換 | 可行但極危險 | 繞過類加載器,直接替換啟動類路徑,破壞兼容性 |
public class MyString { private String delegate; ... }StringUtils、StringHelperfun String.myMethod() { ... }(編譯期語法糖,無運行時影響)雙親委派模型不僅保證了核心類庫的唯一性與安全性,也是 Java 模塊化、熱部署、隔離容器(如 Tomcat、OSGi)實現的基石。理解其原理,能避免踩坑並設計出更健壯的系統架構。