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

Java 反射機制動態呼叫方法完整實作指南

     編輯:Java 相關知識

應用場景

專案中某模組擁有上百個分類代碼,每個代碼對應一個處理方法。若使用大量 if-else 或 switch 判斷,程式碼難以維護。利用 Java 反射機制,可根據代碼動態拼裝方法名並呼叫,極大簡化程式結構。

基礎反射呼叫範例

package com.escs.xmlutils;

import java.lang.reflect.Method;

public class Test {
    public String ceshi() {
        System.out.println("1111111111111");
        return "success";
    }

    public String ceshi(String str) {
        System.out.println(str);
        return str;
    }

    public String ceshi2(String str, int i) {
        for (int j = 0; j < i; j++) {
            System.out.println(str + "22222");
        }
        return str;
    }

    public static void main(String[] args) throws Exception {
        // 載入類別
        Class<?> c = Class.forName("com.escs.xmlutils.Test");
        Object obj = c.newInstance();

        // 取得方法 (方法名, 參數型別...)
        Method method = c.getMethod("ceshi2", String.class, int.class);

        // 執行方法並傳遞參數
        String result = (String) method.invoke(obj, new Object[]{"myname", 4});
        System.out.println(result);
    }
}

封裝通用動態呼叫工具方法

public String fanShe(String methodName, String className) 
        throws ClassNotFoundException, SecurityException, NoSuchMethodException, 
               InstantiationException, IllegalAccessException, IllegalArgumentException, 
               InvocationTargetException {
    
    Class<?> c = Class.forName(className);
    Object obj = c.newInstance();
    
    // 假設方法簽名固定為 (String, int),實際應根據需求動態決定
    Method method = c.getMethod(methodName, String.class, int.class);
    
    String result = (String) method.invoke(obj, new Object[]{"myname", 4});
    return result;
}

進階應用:代碼對應方法自動路由

若代碼為 1~100,方法命名為 ReturnCode1() ~ ReturnCode100(),可直接拼裝方法名呼叫:

String methodName = "ReturnCode" + code; // code 為 1~100
String result = fanShe(methodName, "com.example.Handler");

注意事項

  • 反射呼叫效能較直接呼叫低,高頻熱點路徑建議緩存 Method 物件
  • 需妥善處理各類反射相關異常 (NoSuchMethodException、IllegalAccessException 等)
  • 私有方法需先呼叫 setAccessible(true) 才能存取
  • 生產環境建議搭配快取機制 (如 Guava Cache) 避免重複解析類別與方法

總結

反射機制讓 Java 擁有動態語言的靈活性,善用它能將大量條件判斷轉化為簡潔的動態路由邏輯,但需權衡效能與可讀性,於適當場景使用。

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