2012-09-24 38 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個功能