package java.lang;
public class Test {
public static void main(String[] args) {
char[] c = "1234567890".toCharArray();
String s = new String(0, 10, c); // String(int offset, int count, char[] value) 是 package-private
}
}
編譯通過(符合包權限規則),但運行拋出:
java.lang.SecurityException: Prohibited package name: java.lang
at java.lang.ClassLoader.defineClass(...)
| 層級 | 名稱 | 加載範圍 | 優先級 |
|---|---|---|---|
| 1 | Bootstrap ClassLoader | 核心庫(rt.jar 等) | 最高 |
| 2 | Extension ClassLoader | jre/lib/ext | ↓ |
| 3 | Application ClassLoader | classpath (-cp) | ↓ |
| 4 | 自定義/網絡 ClassLoader | 動態來源 | 最低 |
委派規則:子加載器收到請求 → **先委派給父加載器** → 父加載器找到則返回,否則子加載器自行加載。因此 Bootstrap 優先加載 java.lang.String,自定義 java.lang.Test 永無機會被加載,**核心類不可被替換**。
JLS 規定:同包類可互訪 package-private 成員。**但前提是「由同一 ClassLoader 加載」**。
java.lang.Stringjava.lang.Test這機制從根本上阻止惡意代碼偽裝核心包竊取內部 API。