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 成員?
JVM 內建四級加載器 (優先級遞減):
JAVA_HOME/lib/rt.jar 核心庫。JAVA_HOME/lib/ext 或 java.ext.dirs 目錄下 JAR。classpath 指定路徑類。ClassLoader 實現 (網絡、加密、熱插拔)。雙親委派模型:收到載入請求 → 委派給父加載器 → 父無法載入 → 子自行載入。
核心保護:java.lang.String 由 Bootstrap 載入,自定義 java.lang.Test 由 Application 載入,**不同加載器載入的類即使同包也無法互訪 package-private 成員**,有效防止惡意代碼竊取核心類內部結構。
只有同一 ClassLoader 載入的類之間,才享有 package-private 互訪權限。
這是 Java 安全沙箱的基石:核心類與應用類物理隔離在不同命名空間 (ClassLoader + 包名)。
java.*/javax.* 包類,會被 Bootstrap/Extension 拒載或拋安全異常。ClassCastException/LinkageError 時,檢查類是否被多加載器重複載入。ClassLoader 不僅是類載入器,更是**安全邊界劃分器**。雙親委派 + 命名空間隔離,構建了 Java 獨特的運行時安全模型。