假设我有一个值为“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