我有一個名爲chooseDialog(String s,int i)的靜態方法,我想根據提供給chooseDialog的參數在同一個類(Dialogs.class)內調用另一個方法。 s是所需方法的名稱,我是它的單個參數。Android/Java:使用反射調用方法?
我已經嘗試了很多教程,並花了幾個小時閱讀這個主題,但我似乎無法得到我到底需要做什麼的牢固掌握。
任何想法?
謝謝!
我有一個名爲chooseDialog(String s,int i)的靜態方法,我想根據提供給chooseDialog的參數在同一個類(Dialogs.class)內調用另一個方法。 s是所需方法的名稱,我是它的單個參數。Android/Java:使用反射調用方法?
我已經嘗試了很多教程,並花了幾個小時閱讀這個主題,但我似乎無法得到我到底需要做什麼的牢固掌握。
任何想法?
謝謝!
爲什麼要調用名稱在字符串參數中傳遞的方法?你不能爲不同的動作創建一個常量,然後使用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
Method method = Dialogs.getMethod(s, Integer.class);
method.invoke(null, i);
如果你只是想調用另一個靜態方法的類,那麼你可以使用別人已確定的方法:
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);
}
你真的需要反思嗎? – dacwe 2011-02-04 09:21:32
雖然可能有一個很好的解決方案給你的問題,但最好發佈你正在試圖解決的實際問題。例如。你爲什麼想要做這種方法選擇?通常有人可以找到解決潛在問題的OOP設計模式,而不是找到具體問題的解決方案。例如,工廠模式可能是您需要的,允許您選擇類,然後提供所需的功能作爲抽象消息的實現。不要讓你的問題的細節讓你忽略更大的圖片。 – Ber 2011-02-04 09:22:14