2017-05-17 23 views
2

我有多種方法的類,它接受不同PARAMS和類似foo類在下面的例子中返回不同的類型: -最佳方式

class foo{ 
    public void A(int a , int b){ 
     // do somthing. 
    } 

    public String B(int a , String b){ 
     // do somthing. 
     return "a"; 
    } 

    public Object C(String a , String b){ 
     // do somthing. 
     return null; 
    } 

    public int D(Long a , String b , String c){ 
     // do somthing. 
     return 1; 
    } 
} 
public class bar { 

    public static void main(String[] args) { 

     try { 
      Class c = Class.forName("foo"); 
      Object t = c.newInstance(); 
      Method[] methods = c.getDeclaredMethods(); 
      for(Method m : methods){ 
       String methodName = m.getName(); 
       if(methodName.equalsIgnoreCase("A")) { 
        // How to call method with its argument and return the result using reflection. 
        m.invoke(t,); 
        break; 
       } 
      } 

     }catch (InstantiationException e){ 

     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      // Handle any exceptions thrown by method to be invoked. 
      e.printStackTrace(); 
     } 

    } 

} 

現在我想創建一個實用程序方法,它接受方法名稱和參數,並使用反射調用相應的方法。讓我知道如何使用泛型實用方法傳遞不同的方法參數,並從反射代碼返回結果(它可能返回int,string,如示例中所示的對象)。

+0

一般來說,這是不可信的。你不可能知道每個類的每個參數的期望值是什麼數據值。 – EJP

+0

@EJP是否有可能,如果我將hashmap傳遞給方法,其中key方法名稱和值是params列表,然後使用反射我可以檢查方法名稱並從地圖獲取參數列表,然後調用方法? –

回答

2

在您的示例代碼中,Method類的public Object invoke(Object obj, Object... args)方法將varargs作爲第二個參數。所以,你可以這樣調用A(INT,INT)方法:

m.invoke(t, 3, 4); 

但這不會真正解決你的問題。

請讓我知道如何使用通用實用程序方法傳遞不同的方法參數,並從反射代碼返回結果(它可以返回int,string,如示例中所示的對象)。

這是一個非常糟糕的設計,因爲您想使用反射來完成特定的事情:使用單個入口點方法調用特定方法的特定參數。
它容易出錯,速度較慢。

例如,你可以有2個參數的入口點方法的方法:

  • 一種方法名
  • 可變參數對象的參數值的字符串。

如何使用它? 沒有類型檢查,並通過計算在聲明的方法中傳遞的每個參數的位置:非常容易出錯。
此外,如果您添加/刪除或更改使用的類中的參數,您的反射代碼將很好地編譯,而在運行時會引發異常。

它似乎真的不適合反思。

+0

感謝您的好解釋:)。 –

+0

非常歡迎你:) – davidxxx