我輸入:"ListClients param1 param2"
其將通過" "
到"ListClients", "param1", "param2";
Java:有沒有辦法將文本轉換爲類?
,我想打電話從ListClients一個靜態方法。
所以會做ListClients.someMethodThatTakesPraams(param1, param2);
是有辦法做到這一點在Java中?
我輸入:"ListClients param1 param2"
其將通過" "
到"ListClients", "param1", "param2";
Java:有沒有辦法將文本轉換爲類?
,我想打電話從ListClients一個靜態方法。
所以會做ListClients.someMethodThatTakesPraams(param1, param2);
是有辦法做到這一點在Java中?
是一些例子!您可以使用Class.getDeclaredMethod
查找給定名稱和參數類型的Method
對象。例如,要找到你someMethodThatTakesParams
方法,你可以寫
Method m = ListClients.class.getDeclaredMethod("someMethodThatTakesParams", ArgType1.class, ArgType2.class);
這裏,ArgType1
和ArgType2
是參數類型。
一旦你的方法,你可以按照以下方式調用它:
m.invoke(null, arg1, arg2);
凡arg1
和arg2
是要傳遞的參數。請注意0的第一個參數是null
,因爲該方法是靜態的。
這種方法省略了各種奇怪的事情,除了必須捕獲的異常以及可能需要獲得的安全權限之外,幸運的是這些異常並不難。
Reflection將成爲你的朋友。
+1因爲我認爲這篇文章不值得讚賞。儘管簡單地發佈教程鏈接並且沒有任何解釋肯定不是最有用的東西。 – 2011-01-19 00:41:43
@Tim Bender我同意這一點,但是有些東西你可以放心使用,而不必真正瞭解它們,並且如果你不瞭解它們的話,你可以使用你的代碼。反思絕對屬於第二類。此外,我認爲OP會發現整個概念的名稱有用。) – biziclop 2011-01-19 01:32:34
是的,你可以使用反射。以下是例如創建一個新的實例
Class<Object> fc = Class.forName("ListClients");
Object myObj = fc.newInstance();
這裏確實是invoking methods
我認爲如果必須使用反射,這是一個更清晰的答案。 – trillions 2012-10-18 18:02:44
簡單的硬編碼的方式是創建一個的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。
'魔術'....有趣的標籤選擇。 :D – 2011-01-18 22:58:43
我刪除了魔術標記,因爲它不適用 – 2011-01-19 00:36:08