2014-01-27 44 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,你必须抓住它。