从arraylist调用方法

时间:2012-09-24 19:58:52

标签: java

假设我有一个名为“openURL”和“closeBrowser”的arraylist performActions。这两个值(openURL和closeBrowsers)和方法都在不同的类中。

如何通过从performActions arraylist获取值来调用这些方法?

具体说明:如果我performAction.get(0),则应执行“openURL”方法。

5 个答案:

答案 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可能由1closeBrowser2表示(您当然可以使用任意两个整数)。然后,您可以将这些值存储在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)

如果方法引用不是静态的,那么您需要提供一些上下文才能执行它。

我将在包装类中包装要在其上执行的MethodObject,并提供一个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)

我使用的是脚本语言:

  • 您在Java 6中内置了JavaScript Rhino
  • 您可以调用Groovy代码
  • 您可以使用简单的表达式语言解释器,例如MVEL
  • 如果只有2个功能
  • ,您可以自己解析您的记谱法