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

Java 反射基礎篇:核心 API、動態載入與私有成員訪問全解析

     編輯:Java 相關知識

一、反射核心概念

Java 反射機制是指在運行態動態獲取任意類的完整結構信息(構造器、方法、欄位、修飾符等),並能實例化對象、調用方法、讀寫欄位——哪怕這些成員是 private 或被 @hide 隱藏的。

1.1 核心應用場景

  • 運行時獲取任意對象所屬類:Class.forName(className)
  • 動態實例化對象:clazz.newInstance() / 構造器反射
  • 讀寫任意欄位:field.get/set(obj, value)
  • 調用任意方法(含私有/隱藏):method.invoke(obj, args)

1.2 反射與動態語言的區別

動態語言(Python、Ruby 等)允許運行時修改程式結構或變量類型;Java 反射僅能操作現有結構的實例行為,無法改變類定義本身,因此 Java 仍屬靜態類型語言。

二、核心類與 API 體系

類職責
java.lang.Class類的運行時表示,反射入口
java.lang.reflect.Constructor構造器信息與實例化操作
java.lang.reflect.Field欄位(屬性)信息與讀寫操作
java.lang.reflect.Method方法信息與調用操作
java.lang.reflect.Modifier修飾符解析(public、static、final 等)

關鍵點:Constructor、Field、Method 繼承 AccessibleObject,核心方法 setAccessible(true) 可繞過訪問權限檢查,實現私有成員訪問。

2.1 常用獲取 API 對比

API範圍繼承成員
getDeclaredFields/Methods/Constructors()當前類聲明的所有不包含
getFields/Methods/Constructors()public 成員包含繼承的 public

三、Class 類深度解析

  • 唯一性:JVM 為每個類型維護唯一 Class 對象,由類加載器在加載階段創建,無公共構造器。
  • 基本類型與數組:int.class、void.class、String[].class 皆為 Class 實例。
  • 獲取方式:obj.getClass()、Class.forName()、Type.class。

四、實戰核心技巧

4.1 訪問私有成員三步曲

  1. 獲取聲明:getDeclaredConstructor/Method/Field(name, ...)
  2. 打破封裝:setAccessible(true)
  3. 執行操作:newInstance() / invoke() / get/set()

4.2 突破 @hide 限制(Android 專用)

Android SDK 構建時會隱藏標記 @hide 的 API,導致應用層無法直接調用。反射機制完全繞過編譯期檢查,可直接調用系統隱藏 API,如 Class.forName("android.os.SystemProperties").getMethod("get", String.class).invoke(null, "key")。

4.3 內部類反射命名規則

內部類完整名稱採用 外部類$內部類 格式:

String className = "com.reflect.Outer$Inner";
Class.forName(className);

五、性能與安全考量

  • 性能開銷:反射涉及動態解析,JIT 難以優化,頻繁調用建議緩存 Method/Field 對象或使用 MethodHandle/VarHandle。
  • 安全風險:可破壞封裝邏輯,修改不可變對象狀態,需謹慎使用並在 SecurityManager 下受限。

六、總結

反射是 Java 動態性的基石,支撐著 Spring、Hibernate、Retrofit 等主流框架。掌握核心 API、訪問權限突破、內部類處理,是進階 Java 開發者的必修課。下一篇《實戰篇》將提供生產級封裝工具類與內部類反射深度實踐。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved