Java 反射機制是指在運行態動態獲取任意類的完整結構信息(構造器、方法、欄位、修飾符等),並能實例化對象、調用方法、讀寫欄位——哪怕這些成員是 private 或被 @hide 隱藏的。
Class.forName(className)clazz.newInstance() / 構造器反射field.get/set(obj, value)method.invoke(obj, args)動態語言(Python、Ruby 等)允許運行時修改程式結構或變量類型;Java 反射僅能操作現有結構的實例行為,無法改變類定義本身,因此 Java 仍屬靜態類型語言。
| 類 | 職責 |
|---|---|
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) 可繞過訪問權限檢查,實現私有成員訪問。
| API | 範圍 | 繼承成員 |
|---|---|---|
getDeclaredFields/Methods/Constructors() | 當前類聲明的所有 | 不包含 |
getFields/Methods/Constructors() | public 成員 | 包含繼承的 public |
Class 對象,由類加載器在加載階段創建,無公共構造器。int.class、void.class、String[].class 皆為 Class 實例。obj.getClass()、Class.forName()、Type.class。getDeclaredConstructor/Method/Field(name, ...)setAccessible(true)newInstance() / invoke() / get/set()Android SDK 構建時會隱藏標記 @hide 的 API,導致應用層無法直接調用。反射機制完全繞過編譯期檢查,可直接調用系統隱藏 API,如 Class.forName("android.os.SystemProperties").getMethod("get", String.class).invoke(null, "key")。
內部類完整名稱採用 外部類$內部類 格式:
String className = "com.reflect.Outer$Inner";
Class.forName(className);
Method/Field 對象或使用 MethodHandle/VarHandle。反射是 Java 動態性的基石,支撐著 Spring、Hibernate、Retrofit 等主流框架。掌握核心 API、訪問權限突破、內部類處理,是進階 Java 開發者的必修課。下一篇《實戰篇》將提供生產級封裝工具類與內部類反射深度實踐。