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

Java 類加載器與反射機制核心原理

     編輯:Java 綜合教學

Java 類加載器與反射機制核心原理

JVM 與類的關係

執行 java 命令啟動一個 JVM 進程。同一 JVM 內所有執行緒、變數共享進程記憶體區。JVM 終止條件:

  1. 程式正常執行結束
  2. 呼叫 System.exit() 或 Runtime.getRuntime().exit()
  3. 未捕獲的異常/錯誤導致異常終止
  4. 作業系統強制終止進程

JVM 終止意味著堆內存資料全部釋放。

類加載流程

當程式主動使用某類且該類尚未載入記憶體時,觸發類加載。類加載將 .class 位元碼讀入記憶體,並在方法區建立 java.lang.Class 實例 —— 類本身也是物件。

類加載三階段:

  1. 載入:透過類全限定名獲取二進位位元組流,轉換為方法區資料結構,建立 Class 物件
  2. 連接:驗證、準備 (靜態變數賦預設值)、解析 (符號參考轉直接參考)
  3. 初始化:執行 <clinit> 方法 (靜態變數賦值、靜態區塊)

類加載器層級結構

加載器父加載器載入範圍
Bootstrap ClassLoader無 (C++ 實現)JAVA_HOME/lib/rt.jar 等核心庫
Extension ClassLoaderBootstrapJAVA_HOME/lib/ext/*.jar
Application ClassLoaderExtensionClasspath 指定的類 (使用者代碼)
自定義 ClassLoaderApplication使用者定義來源 (網路、加密檔、資料庫等)

雙親委派模型:子加載器收到請求先委派父加載器,父無法載入時子才嘗試。目的:避免核心類被竄改、確保類載入唯一性。

反射機制核心

反射是在執行期動態獲取類資訊、建立實例、呼叫方法/存取屬性的能力。核心 API:

  • Class.forName("full.class.Name"):獲取 Class 物件 (觸發初始化)
  • clazz.newInstance() / constructor.newInstance(args):建立實例
  • method.invoke(obj, args):呼叫方法
  • field.get(obj) / field.set(obj, val):存取屬性 (需 setAccessible(true) 破壞封裝)

應用場景

  • 框架核心:Spring IoC (掃描註解、實例化 Bean)、MyBatis (映射 ResultSet 到 POJO)
  • 動態代理:JDK Proxy、CGLIB、AOP 實現基礎
  • 外掛架構/熱插拔:運行時載入外部 Jar
  • 序列化/反序列化:Jackson、Gson、Hessian 等

效能與安全注意

  • 反射比直接呼叫慢 (JIT 難優化、存取檢查),熱點路徑慎用
  • setAccessible(true) 可能被 SecurityManager 禁止
  • JDK 9+ 模組化系統需 --add-opens 開放封裝
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved