2011-02-04 186 views
7

我有一個名爲chooseDialog(String s,int i)的靜態方法,我想根據提供給chooseDialog的參數在同一個類(Dialogs.class)內調用另一個方法。 s是所需方法的名稱,我是它的單個參數。Android/Java:使用反射調用方法?

我已經嘗試了很多教程,並花了幾個小時閱讀這個主題,但我似乎無法得到我到底需要做什麼的牢固掌握。

任何想法?

謝謝!

+0

你真的需要反思嗎? – dacwe 2011-02-04 09:21:32

+1

雖然可能有一個很好的解決方案給你的問題,但最好發佈你正在試圖解決的實際問題。例如。你爲什麼想要做這種方法選擇?通常有人可以找到解決潛在問題的OOP設計模式,而不是找到具體問題的解決方案。例如,工廠模式可能是您需要的,允許您選擇類,然後提供所需的功能作爲抽象消息的實現。不要讓你的問題的細節讓你忽略更大的圖片。 – Ber 2011-02-04 09:22:14

回答

13

爲什麼要調用名稱在字符串參數中傳遞的方法?你不能爲不同的動作創建一個常量,然後使用switch,並在每種情況下調用參數爲i的方法?

您將有編譯器檢查錯誤代碼的好處。

編輯:如果你真的想使用反射,檢索Method對象有:

Method m = YourClass.class.getMethod("method_name",new Class[] { Integer.class }) 

我猜Integer.class可能會奏效。然後調用梅託德作爲

m.invoke(null,123); //first argument is the object to invoke on, ignored if static method 
2
Method method = Dialogs.getMethod(s, Integer.class); 
method.invoke(null, i); 
1

如果你只是想調用另一個靜態方法的類,那麼你可以使用別人已確定的方法:

Method method = Dialogs.getMethod(s, Integer.class); 
method.invoke(null, i); 

但是,如果你想爲了能夠使用靜態方法調用非靜態方法,那麼您需要傳入要引用的對象或使chooseDialog非靜態。

function chooseDialog(Object o, String s, Integer i) { 
    Method method = Dialogs.getMethod(o, Integer.class); 
    method.invoke(o, i); 
} 

但我不認爲這是處理問題的正確OOP方式。並根據您的意見,反思並不是絕對必要的,並選擇Dialog分析字符串,並將其傳遞給適當的方法是一種更安全的方法。在任何一種方法中,你的單元測試應該看起來都一樣。

if (s.equals("dialog1")) { 
     dialog1(i); 
    }