2012-09-24 17 views
1

假设我有一个值为“openURL”和“closeBrowser”的数组列表performActions。这两个值(openURL和closeBrowsers)和方法都在不同的类中。来自arraylist的调用方法

如何调用这些方法从performActions ArrayList中所获得的价值?

具体而言:如果我做performAction.get(0)应执行“的OpenURL”的方法。

+0

通过值都由你自己分析你的符号,我假定你的意思含有“的OpenURL”和“closeBrowser”字符串。在这种情况下,没有办法,这不是PHP!研究使用接口来创建伪函数指针。 – slugonamission

+0

实际上有一种方法可以调用给定Java中方法名称的方法。但我首先想知道:为什么地球上?我认为你应该重新设计你的代码。 –

+2

使用多态:例如一个名为Action的接口和两个类UrlOpener和BrowserCloser通过重新定义来自Action的execute()方法来实现它 – Mik378

回答

0

使用反射。例如:

例如: Method method = getClass()。getMethod(yourarraylist.get(0)); method.invoke(this);

这与我们在加载jdbc驱动程序时所做的类似class.forName();

我建议阅读关于反射。 Hipe this helps :-)

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也许可以通过1closeBrowser通过2(当然你可以使用任何两个整数)表示。然后,您将这些值存储在ArrayList<Integer>中,之后您将循环访问您的列表并针对每个值调用runMethod之类的方法,从而执行您所需的方法。

编辑:如果你的方法需要一个参数,你总是可以采用使用Map!而非ArrayList提供了一个类似的概念,绘制一个整数(表示法)是它的参数。

+0

你是否反对一般或在这个特定情况下的反思?在这个具体情况下,我同意。 –

+0

大多数时候都有避免使用反射的方法(这是其中之一)。话虽如此,我可以看到在极少数情况下它可能会派上用场。所以我一般都不反对,我只是认为这往往是过度的。 – arshajii

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 
    } 
} 
0

假设ArrayList包含Method,方法是静态的,你可以使用Method.invoke(null, null)

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

我想包的MethodObject上它是在一个包装类执行,并提供了一个调用/ 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); 
    } 
0

我会使用脚本语言:

  • 你的JavaScript犀牛内置Java 6中
  • 您可以拨打Groovy代码
  • 您可以使用简单的表达式语言解释器一样例如MVEL
  • 你可以,如果只有2个功能