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

Java 反射獲取方法參數類型完整範例

     編輯:Java 相關知識

需求場景

框架開發、動態代理、註解處理器、測試工具等場景,常需在執行期根據方法名稱獲取參數類型、修飾符、返回類型等元資訊。

核心 API

  • Class.getDeclaredMethod(name, paramTypes):精確匹配參數類型取得 Method
  • Method.getParameterTypes():回傳 Class[] 參數類型陣列
  • Method.getGenericParameterTypes():保留泛型資訊(Type[])

完整範例


import java.lang.reflect.Method;
import java.util.Arrays;

public class ReflectionParamDemo {
    public static void main(String[] args) throws Exception {
        // 目標類別
        Class<?> clazz = DemoService.class;

        // 1. 獲取所有公開方法
        System.out.println("=== 所有公開方法 ===");
        for (Method m : clazz.getMethods()) {
            System.out.printf("%s %s(%s)%n",
                m.getReturnType().getSimpleName(),
                m.getName(),
                Arrays.toString(m.getParameterTypes()));
        }

        // 2. 根據方法名與參數類型精確獲取
        Class<?>[] paramTypes = {String.class, int.class, boolean.class};
        Method target = clazz.getDeclaredMethod("process", paramTypes);
        System.out.println("\n=== 目標方法詳情 ===");
        System.out.println("方法名:" + target.getName());
        System.out.println("返回類型:" + target.getReturnType());
        System.out.println("參數類型:" + Arrays.toString(target.getParameterTypes()));
        System.out.println("泛型參數類型:" + Arrays.toString(target.getGenericParameterTypes()));
        System.out.println("修飾符:" + Modifier.toString(target.getModifiers()));

        // 3. 動態調用
        Object instance = clazz.getDeclaredConstructor().newInstance();
        Object result = target.invoke(instance, "測試資料", 123, true);
        System.out.println("\n調用結果:" + result);
    }
}

class DemoService {
    public String process(String name, int id, boolean flag) {
        return String.format("處理完成:%s #%d flag=%b", name, id, flag);
    }
    public void otherMethod() {}
}

執行輸出


=== 所有公開方法 ===
String process(String, int, boolean)
Void otherMethod()
Void wait(long, int)
...

=== 目標方法詳情 ===
方法名:process
返回類型:class java.lang.String
參數類型:[class java.lang.String, int, boolean]
泛型參數類型:[class java.lang.String, int, boolean]
修飾符:public
調用結果:處理完成:測試資料 #123 flag=true

進階技巧

  1. 參數名稱獲取:JDK 8+ 編譯時加 -parameters,可用 Parameter.getName() 取得原始參數名。
  2. 泛型解析:Type 為 ParameterizedType 時,可進一步取得實際泛型參數(如 List<String> 的 String)。
  3. 效能優化:反射調用較慢,熱點路徑可用 MethodHandle 或生成字節碼(ASM/ByteBuddy)加速。

常見坑點

  • getMethod 只能取得公開方法(含繼承);getDeclaredMethod 可取得私有/包私有但不含繼承。
  • 基本型別對應 int.class、boolean.class 等,非包裝類別。
  • 可變參數在反射中為陣列類型(如 String[].class)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved