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

Java ClassLoader 與 Package 權限機制深度解析:雙親委派模型實戰驗證

     編輯:Java 相關知識

實驗:偽裝 java.lang 包訪問 String 包私有構造器

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(...)

ClassLoader 四層級與雙親委派模型

層級名稱加載範圍優先級
1Bootstrap ClassLoader核心庫(rt.jar 等)最高
2Extension ClassLoaderjre/lib/ext↓
3Application ClassLoaderclasspath (-cp)↓
4自定義/網絡 ClassLoader動態來源最低

委派規則:子加載器收到請求 → **先委派給父加載器** → 父加載器找到則返回,否則子加載器自行加載。因此 Bootstrap 優先加載 java.lang.String,自定義 java.lang.Test 永無機會被加載,**核心類不可被替換**。

Package 權限的真實邊界

JLS 規定:同包類可互訪 package-private 成員。**但前提是「由同一 ClassLoader 加載」**。

  • Bootstrap 加載 java.lang.String
  • Application 加載 java.lang.Test
  • **不同加載器 → 視為不同運行時包 → 無 package 權限互訪**

這機制從根本上阻止惡意代碼偽裝核心包竊取內部 API。

核心結論

  1. ClassLoader 命名空間隔離 > 包名隔離。
  2. 雙親委派保證核心類唯一性與安全性。
  3. Package 私有訪問需「同包名 + 同加載器」雙重條件。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved