2014-01-27 74 views
2

我想了解如何創建方法的ArrayList。關於方法和ArrayList的清晰

public class a { 
public static b(){} 
public static c(){} 
public static d(){} 
public static e(){} 

public static void main(String[] arg){ 
ArrayList<Method> lst = new ArrayList<Method>(); 
lst.add(1, a()); 
lst.add(2, b()); 
lst.add(3, c()); 
lst.add(4, d()); 
lst.add(5, e()); 
} 

我想知道,爲什麼它是喜歡它,可能會有人這麼好心解釋:

public static Collection<? extends Method> a(){} 
... 
lst.addAll(1, a()); 

爲什麼使用集合? 爲什麼不使用簡單的添加(Object)?

哦,還有一件事。我如何從ArrayList執行後面的方法?

for (Method i : lst){ 
i;} 

謝謝你的協助。

+1

這裏已經有一些正確的答案,但我只是想我會評論說,除非性能是一個問題,否則這將對你非常有用。已經表明,使用Java反射比實際對象上的實際方法調用要慢三個數量級。如果遇到性能問題,您可能會考慮開發一個接口來定義您期望調用的方法,然後在該接口的實例中包裝要調用方法的任何對象。如果表現不是問題,那聽起來你已經想通了! – CodeBlind

回答

3

如果你想使用反射,你應該使用getDeclaredMethod來獲得該方法,因爲許多其他的答案已經說明了。然而,在Java代碼中比較常見(也許更清潔)的做法,避免使用反射,就是讓一個接口,你可以提供的實現:

private static interface Foo { 
    public void doFoo(); 
} 

public static Foo a = new Foo() { 
    public void doFoo() { 
    // Do 'a' stuff here. 
    } 
} 

public static Foo b = new Foo() { 
    public void doFoo() { 
    // Do 'b' stuff here. 
    } 
} 

... 

public static Foo e = new Foo() { 
    public void doFoo() { 
    // Do 'e' stuff here. 
    } 
} 

public static void main(String[] arg){ 
    ArrayList<Foo> lst = new ArrayList<Foo>(); 
    lst.add(1, a); 
    lst.add(2, b); 
    lst.add(3, c); 
    lst.add(4, d); 
    lst.add(5, e); 
} 

然後調用該函數,可以調用doFoo()上列表中的每個Foo對象。

1

可以得到聲明的方法在你的類是這樣的:

public class MyClass { 
    public void a() { 
     System.out.println("A!"); 
    } 

    public static void main(String... args) 
    { 
     Method methodA = getClass().getDeclaredMethod("a"); 
    } 
} 
1
  • 你需要對所有的返回類型方法( 構造函數除外),如public static void b(){}
  • lst.add(1, a());將只調用該方法並嘗試將該方法的返回值添加到給定索引處的列表中。
  • 此外,您還需要遵循Java命名約定(如類名稱應始終以大寫字母開頭)

如果你想添加你需要使用反射list.add(a.class.getMethod("b"));

2

作爲的Method在Java 7中,你不能像在這裏所做的那樣將一個方法看作一個變量。您需要使用Reflection來訪問代表方法的對象Method。使用a類中的getMethod method來檢索正確的Method對象,您可以將add對應到ArrayList

addAll method將collection參數中的所有元素添加到要調用的集合addAll。如果您打電話add(Collection),那麼Collection本身就是下一個新元素。

要調用Method表示的方法,請致電invoke method。小心,getMethodinvoke方法都會拋出自己的Exception,你必須抓住它。