Java 反射機制允許運行時動態訪問類的私有成員,僅限於獨立 Java 應用(單元測試、常規程序)。Applet 或受安全管理器限制的環境需調整 SecurityManager,本文不贅述。
Class.getDeclaredField(String name):獲取指定類聲明的字段(含私有),不包含繼承字段;Field.setAccessible(true):關閉訪問檢查,僅對反射生效;Field.get(Object obj):讀取字段值。public class PrivateObject {
private String privateString = null;
public PrivateObject(String privateString) { this.privateString = privateString; }
}
// 反射訪問
PrivateObject obj = new PrivateObject("The Private Value");
Field field = PrivateObject.class.getDeclaredField("privateString");
field.setAccessible(true); // 關鍵步驟
String value = (String) field.get(obj);
System.out.println("fieldValue = " + value); // 輸出:The Private Value
注意:getField()/getFields() 僅返回 public 字段,無法訪問私有成員。
Class.getDeclaredMethod(String name, Class[] paramTypes):獲取聲明的方法(含私有);Method.setAccessible(true):關閉訪問檢查;Method.invoke(Object obj, Object[] args):調用方法並獲取返回值。public class PrivateObject {
private String privateString;
public PrivateObject(String s) { this.privateString = s; }
private String getPrivateString() { return this.privateString; }
}
// 反射調用
PrivateObject obj = new PrivateObject("The Private Value");
Method method = PrivateObject.class.getDeclaredMethod("getPrivateString", null);
method.setAccessible(true);
String ret = (String) method.invoke(obj, null);
System.out.println("returnValue = " + ret); // 輸出:The Private Value
注意:getMethod()/getMethods() 僅返回 public 方法。
setAccessible(true) 僅繞過 Java 語言級訪問檢查,不影響 JVM 安全管理器。若 SecurityManager 禁止 suppressAccessChecks 權限,調用將拋出 SecurityException。生產環境請謹慎評估風險。