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

Java 反射實戰:非法訪問異常捕獲與字段操作詳解

     編輯:Java 程式設計入門

場景背景

Java 反射機制允許運行時動態訪問私有字段,但若權限不足會拋出 IllegalAccessException;若參數類型不匹配則拋出 IllegalArgumentException。本文以 String 類的私有 hash 字段為例,演示如何通過反射讀取並妥善處理這兩類異常。

核心步驟

  1. 獲取 String.class 的 Class 對象
  2. 調用 getDeclaredFields() 取得所有聲明字段(含私有)
  3. 遍歷字段,匹配名為 "hash" 的字段
  4. 嘗試用 field.getInt("測試字符串") 讀取值
  5. 分別捕獲 IllegalArgumentException 與 IllegalAccessException

完整代碼

import 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 實例,或字段類型不是 int
  • IllegalAccessException:字段為 private,未調用 setAccessible(true)

正確讀取私有字段的姿勢

field.setAccessible(true); // 關鍵:暴力反射破封裝
int hashVal = field.getInt("hello"); // 正常讀取

運行結果示例

控制台輸出異常信息

圖中可見:未加 setAccessible(true) 時拋出 IllegalAccessException,說明訪問被阻攔。

最佳實踐建議

  • 生產代碼盡量避免暴力反射,優先考慮公開 API 或設計模式
  • 若必須反射,務必在 try-catch 中處理兩類異常,並記錄日誌
  • JDK 9+ 模組化後,需在 module-info.java 中 opens 相關包才能暴力反射

總結

本例通過最簡代碼演示了反射訪問私有字段的典型異常場景,幫助開發者理解 IllegalArgumentException 與 IllegalAccessException 的成因與區別,為後續學習框架原理(如 Spring、Hibernate 的反射應用)打下基礎。

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