2011-01-18 133 views
3

我輸入:"ListClients param1 param2" 其將通過" ""ListClients", "param1", "param2";Java:有沒有辦法將文本轉換爲類?

,我想打電話從ListClients一個靜態方法。

所以會做ListClients.someMethodThatTakesPraams(param1, param2);

是有辦法做到這一點在Java中?

+2

'魔術'....有趣的標籤選擇。 :D – 2011-01-18 22:58:43

+1

我刪除了魔術標記,因爲它不適用 – 2011-01-19 00:36:08

回答

5

是一些例子!您可以使用Class.getDeclaredMethod查找給定名稱和參數類型的Method對象。例如,要找到你someMethodThatTakesParams方法,你可以寫

Method m = ListClients.class.getDeclaredMethod("someMethodThatTakesParams", ArgType1.class, ArgType2.class); 

這裏,ArgType1ArgType2是參數類型。

一旦你的方法,你可以按照以下方式調用它:

m.invoke(null, arg1, arg2); 

arg1arg2是要傳遞的參數。請注意0​​的第一個參數是null,因爲該方法是靜態的。

這種方法省略了各種奇怪的事情,除了必須捕獲的異常以及可能需要獲得的安全權限之外,幸運的是這些異常並不難。

-1

Reflection將成爲你的朋友。

+0

+1因爲我認爲這篇文章不值得讚賞。儘管簡單地發佈教程鏈接並且沒有任何解釋肯定不是最有用的東西。 – 2011-01-19 00:41:43

+0

@Tim Bender我同意這一點,但是有些東西你可以放心使用,而不必真正瞭解它們,並且如果你不瞭解它們的話,你可以使用你的代碼。反思絕對屬於第二類。此外,我認爲OP會發現整個概念的名稱有用。) – biziclop 2011-01-19 01:32:34

3

是的,你可以使用反射。以下是例如創建一個新的實例

Class<Object> fc = Class.forName("ListClients"); 
    Object myObj = fc.newInstance(); 

這裏確實是invoking methods

+0

我認爲如果必須使用反射,這是一個更清晰的答案。 – trillions 2012-10-18 18:02:44

2

簡單的硬編碼的方式是創建一個的if/else鏈和調用正確的方法:

String input = "ListClients param1 param2"; 
String [] args = input.split(" "); 
switch(args.length) { 
    case 0: 
     return ListClients.someMethod(); 
    case 1: 
     return ListClients.someMethod(args[0]); 
    case 2: 
     return LIstClients.someMethod(args[1]); 
    default: 
     return // something default   
} 

雖然這看起來有點有古老,它是非常安全的,因爲你的程序到底如何你代碼應該被調用。

另一種解決方案將涉及使用反射爲他人提及:

String input = "ListClients param1 param2"; 
String [] args = input.split(" "); 
Class[] types = new Classs[ args.length ]; 
Object[] values = new Object[ args.lenght ]; 
for(int i = 0 ; i < types.lenght ; i++) { 
    types[i] = String.class; 
    values [i] = args[i]; 
} 

ListClients.class 
    .getDeclaredMethod("someMethod", types) 
    .invoke(null, values); 

所有這些由數反映的包圍檢查的異常。

你應該考慮如何動態需要自己的應用程序,和/如果你會做些什麼來防止這樣的野生電話:「System.exit(0)」調用或任何其他種類的code injection

相關問題