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

Java 反射機制實戰:動態獲取類資訊與調用方法

     編輯:Java 相關知識

什麼是反射?

在運行狀態下,對任意一個類,都能知道其所有屬性和方法;對任意一個對象,都能調用它的任意方法。這種動態獲取資訊並動態調用對象方法的功能稱為 Java 反射機制。

核心功能:

  • 運行時判斷任意對象所屬的類。
  • 運行時構造任意類的對象。
  • 運行時獲取任意類的成員變數與方法。
  • 運行時調用任意對象的方法。
  • 生成動態代理。

實戰範例:動態列印類結構並調用方法

package com.beidou.test;
import java.lang.reflect.Method;

public class Dynamic {
    public static void main(String[] args) throws Exception {
        // 1. 獲取 Class 物件
        Class<?> clazz = Dynamic.class;

        // 2. 獲取所有宣告的方法
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            System.out.print("方法名:" + method.getName());
            // 參數類型
            Class<?>[] paramTypes = method.getParameterTypes();
            for (int i = 0; i < paramTypes.length; i++) {
                System.out.print(" | 參數" + i + ":" + paramTypes[i].getName());
            }
            // 返回類型
            System.out.println(" | 返回類型:" + method.getReturnType());
        }

        // 3. 實例化對象
        Object obj = clazz.newInstance();

        // 4. 獲取指定方法並調用
        // 假設存在 public String getAge(int age, String name)
        Method getAge = clazz.getMethod("getAge", int.class, String.class);
        Object[] arguments = new Object[]{23, "abc"};
        String result = (String) getAge.invoke(obj, arguments);
        System.out.println("調用結果:" + result);
    }

    public String getAge(int age, String name) {
        return name + ": " + age;
    }
}

關鍵 API 速查

API用途
Class.forName("全限定名")根據類名載入 Class 物件
clazz.newInstance()調用無參構造器創建實例
clazz.getDeclaredMethods()獲取所有宣告方法(含 private)
clazz.getMethod(name, paramTypes)獲取指定 public 方法
method.invoke(obj, args)調用方法
clazz.getDeclaredFields()獲取所有宣告欄位
field.setAccessible(true)暴力反射訪問私有欄位

應用場景

  • 框架開發(Spring、MyBatis 等大量使用反射實現依賴注入、映射)。
  • 動態代理(AOP、RPC)。
  • 註解處理、序列化/反序列化庫。
  • 熱加載、插件化架構。

注意事項

  • 反射會破壞封裝性,慎用於業務代碼。
  • 性能開銷較大(方法調用、類型檢查),高頻熱點路徑建議緩存 Method/Field 物件。
  • 安全管理器可能限制反射權限。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved