2012-05-09 53 views
2

我有一個通用字符串存儲在變量String func = "validate";,我想調用該名稱的函數即我需要調用validate()函數。
我的意思是說我將變量傳遞給一些功能
public void callFunc(String func){
....
}
所以,上面的函數應該調用作爲參數的callfunc()傳遞函數名稱相應的功能。Java:如何調用其名稱存儲在字符串變量中的函數

+3

使用反射:) –

+0

一個常見的示例是使用Class.forName()加載相應的JDBC驅動程序:http://www.xyzws.com/Javafaq/what-does-classforname-method-do/17 – paulsm4

回答

14

可以使用反射來做到這一點,例如,

Method method = getClass().getMethod(func); 
// TODO: Validation 
method.invoke(this); 

這是假設你想打電話this的方法,當然,它是一個實例方法。查看Class.getMethod和相關方法,以及Method本身,瞭解更多詳情。您可能需要getDeclaredMethod,而您可能需要使其可訪問。

我會看看你是否可以想到一種避免這種可能的方法,儘管如此 - 反射會很快變得雜亂。值得退一步考慮這是否是最好的設計。如果您向我們提供更多詳細信息,我們可能會提出替代方案。

+0

感謝很多.. :) –

+0

如果我想將參數傳遞給函數'func(val1,val2)' –

+1

@ShamsUdDin,那麼你使用'invoke(this,val1,val2)'。閱讀我鏈接到的文檔。 –

0

還有另一種方法比使用反射。你可以寫出如下模式匹配:

switch (func) { 
    case "validate": validate(); break; 
    case "apply": apply(); break; 
    default: break; 
} 

但我同意喬恩:儘量避免這種情況。如果您使用模式匹配,則必須應用更改兩次。例如,如果您添加其他方法,則需要將其添加到函數命名方法和模式匹配中。

+0

如果我們使用開關功能,那麼我們的代碼將不會變爲泛型,我的意思是說假設我創建了一個名爲'mypage()'的新函數,然後我需要添加我的案例在切換功能。 –

+0

這正是我在底部所說的。 –

相關問題