假设我有一个名为“openURL”和“closeBrowser”的arraylist performActions
。这两个值(openURL和closeBrowsers)和方法都在不同的类中。
如何通过从performActions
arraylist获取值来调用这些方法?
具体说明:如果我performAction.get(0)
,则应执行“openURL”方法。
答案 0 :(得分:1)
不,没有简单的方式来做你所描述的(你可以使用反射,但我会反对它)。但是,您可以存储一组整数,然后将这些整数用作执行各种功能的“代码”。这有点类似于存储方法本身。
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
来使用类似的概念,映射整数(表示方法)它的论点。
答案 1 :(得分:1)
我会保持简单并使用字符串比较来执行你的方法:
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
}
}
答案 2 :(得分:0)
使用反射。
例如: 方法method = getClass()。getMethod(yourarraylist.get(0)); method.invoke(本);
这类似于我们在加载jdbc驱动程序时所做的操作class.forName();
我建议阅读有关反思的内容。 希望这有助于: - )
答案 3 :(得分:0)
假设ArrayList
包含Method,并且该方法是静态的,您可以使用Method.invoke(null, null)
如果方法引用不是静态的,那么您需要提供一些上下文才能执行它。
我将在包装类中包装要在其上执行的Method
和Object
,并提供一个invoke / 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);
}
答案 4 :(得分:0)
我使用的是脚本语言: