Java 反射機制允許運行時動態訪問私有字段,但若權限不足會拋出 IllegalAccessException;若參數類型不匹配則拋出 IllegalArgumentException。本文以 String 類的私有 hash 字段為例,演示如何通過反射讀取並妥善處理這兩類異常。
String.class 的 Class 對象getDeclaredFields() 取得所有聲明字段(含私有)"hash" 的字段field.getInt("測試字符串") 讀取值IllegalArgumentException 與 IllegalAccessExceptionimport java.lang.reflect.Field;
public class ExceptionTest {
public static void main(String[] args) {
Class<?> clazz = String.class;
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
System.out.println(field); // 打印所有字段信息
if (field.getName().equals("hash")) {
try {
// 注意:getInt 需傳入 String 實例,而非字段名
System.out.println(field.getInt("hello"));
} catch (IllegalArgumentException e) {
System.out.println("參數錯誤:" + e);
} catch (IllegalAccessException e) {
System.out.println("訪問受限:" + e);
}
}
}
}
}
IllegalArgumentException:傳入的對象不是 String 實例,或字段類型不是 intIllegalAccessException:字段為 private,未調用 setAccessible(true)field.setAccessible(true); // 關鍵:暴力反射破封裝
int hashVal = field.getInt("hello"); // 正常讀取

圖中可見:未加 setAccessible(true) 時拋出 IllegalAccessException,說明訪問被阻攔。
try-catch 中處理兩類異常,並記錄日誌module-info.java 中 opens 相關包才能暴力反射本例通過最簡代碼演示了反射訪問私有字段的典型異常場景,幫助開發者理解 IllegalArgumentException 與 IllegalAccessException 的成因與區別,為後續學習框架原理(如 Spring、Hibernate 的反射應用)打下基礎。