假設我有一個值爲「openURL」和「closeBrowser」的數組列表performActions
。這兩個值(openURL和closeBrowsers)和方法都在不同的類中。來自arraylist的調用方法
如何調用這些方法從performActions
ArrayList中所獲得的價值?
具體而言:如果我做performAction.get(0)
應執行「的OpenURL」的方法。
假設我有一個值爲「openURL」和「closeBrowser」的數組列表performActions
。這兩個值(openURL和closeBrowsers)和方法都在不同的類中。來自arraylist的調用方法
如何調用這些方法從performActions
ArrayList中所獲得的價值?
具體而言:如果我做performAction.get(0)
應執行「的OpenURL」的方法。
使用反射。例如:
例如: Method method = getClass()。getMethod(yourarraylist.get(0)); method.invoke(this);
這與我們在加載jdbc驅動程序時所做的類似class.forName();
我建議閱讀關於反射。 Hipe this helps :-)
不,沒有容易做你所描述的方式(你可以使用反射,但我會建議反對它)。但是,您可以存儲一組整數,然後使用這些整數作爲「代碼」來執行各種功能。這有點類似於存儲方法本身。
public void runMethod(int n) {
switch (n) {
case 1:
// do something (e.g. run a certain method)
break;
case 2:
// do something else (e.g. run another method)
break;
...
}
}
所以你的情況,openURL
也許可以通過1
和closeBrowser
通過2
(當然你可以使用任何兩個整數)表示。然後,您將這些值存儲在ArrayList<Integer>
中,之後您將循環訪問您的列表並針對每個值調用runMethod
之類的方法,從而執行您所需的方法。
編輯:如果你的方法需要一個參數,你總是可以採用使用Map
!而非ArrayList
提供了一個類似的概念,繪製一個整數(表示法)是它的參數。
你是否反對一般或在這個特定情況下的反思?在這個具體情況下,我同意。 –
大多數時候都有避免使用反射的方法(這是其中之一)。話雖如此,我可以看到在極少數情況下它可能會派上用場。所以我一般都不反對,我只是認爲這往往是過度的。 – arshajii
我會保持它的簡單和使用字符串比較來執行你的方法:
List<String> items; // from Excel
for (String item : items) {
// for example, item might be: openURL("www.google.com")
if (item.startsWith("openURL(")) {
// parse out the actual url
String url = item.replaceAll(".*\"(.*)\".*", "$1");
openURL(url);
} else if (item.startsWith("closeURL(")) {
// etc
}
}
假設ArrayList
包含Method,方法是靜態的,你可以使用Method.invoke(null, null)
如果方法參考不是靜態的,那麼你需要提供一些上下文才能執行它。
我想包的Method
和Object
上它是在一個包裝類執行,並提供了一個調用/ execute方法...
public class ProxyMethod {
private Method method;
priavte Object instance;
public ProxyMethod(Object instance, Method method) {
this.instance = instance;
this.method = method;
}
public void invoke() {
method.invoke(this, null);
}
}
現在,您還可以提供參數,以及,如果需要至...
public class ProxyMethod {
// Previous decelerations...
private Object[] parameters;
public ProxyMethod(Object instance, Method method, Object... parameters) {
this(instance, methd);
this.parameters = parameters;
}
public void invokeWith() {
method.invoke(this, parameters);
}
public void invokeWith(Object... parameters) {
method.invoke(this, parameters);
}
我會使用腳本語言:
通過值都由你自己分析你的符號,我假定你的意思含有「的OpenURL」和「closeBrowser」字符串。在這種情況下,沒有辦法,這不是PHP!研究使用接口來創建僞函數指針。 – slugonamission
實際上有一種方法可以調用給定Java中方法名稱的方法。但我首先想知道:爲什麼地球上?我認爲你應該重新設計你的代碼。 –
使用多態:例如一個名爲Action的接口和兩個類UrlOpener和BrowserCloser通過重新定義來自Action的execute()方法來實現它 – Mik378