getDeclaredField / getDeclaredMethodsetAccessible(true)field.set(obj, value) / method.invoke(obj, args)import java.lang.reflect.*;
public class ReflectionModifier {
public static void main(String[] args) throws Exception {
// 目標對象
DemoTest target = new DemoTest();
Class> clazz = target.getClass();
// --- 1. 修改私有字段 ---
Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true); // 關鍵!
nameField.set(target, "王五"); // 修改值
System.out.println("修改後 name = " + nameField.get(target)); // 驗證
// --- 2. 調用私有方法 ---
Method privateMethod = clazz.getDeclaredMethod("getName2");
privateMethod.setAccessible(true);
String result = (String) privateMethod.invoke(target);
System.out.println("私有方法返回: " + result);
}
}
class DemoTest {
private String name = "123";
public String getName() {
System.out.println("public getName: " + name);
return name;
}
private String getName2() {
System.out.println("private getName2: " + name);
return name;
}
}
| 操作 | API | 說明 |
|---|---|---|
| 獲取所有聲明字段 | getDeclaredFields() | 含 private/protected/default/public,不含繼承 |
| 獲取 public 字段 | getFields() | 含繼承鏈 public 字段 |
| 獲取聲明方法 | getDeclaredMethod(name, paramTypes) | 精確匹配參數類型 |
| 修改字段值 | field.set(obj, newValue) | 基本類型自動拆箱/裝箱 |
| 讀取字段值 | field.get(obj) | 返回 Object,需轉型 |
Field/Method 對象。掌握
setAccessible(true)這把「萬能鑰匙」,同時牢記「大權在手,責任在肩」。業務邏輯請優先通過公共 API 完成,反射留給基礎設施層。