关于Methods和ArrayList的清晰度

时间:2014-01-27 23:37:49

标签: java collections 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());

为什么要使用Collection? 为什么不简单地使用add(Object)?

哦,还有一件事。如何从ArrayList执行以后的方法?

for (Method i : lst){
i;}

感谢您的帮助。

5 个答案:

答案 0 :(得分: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 :(得分:2)

从Java 7开始,您无法将方法视为变量,就像您在此处所做的那样。您需要使用Reflection来访问代表该方法的Method对象。使用a课程上的getMethod method检索正确的Method对象,您add可以ArrayList

addAll method将集合参数中的所有元素添加到您正在调用addAll的集合中。如果你打电话给add(Collection),那么Collection本身就是下一个新元素。

要调用由Method表示的方法,请调用invoke method。小心,getMethodinvoke方法都会抛出你自己必须捕获的Exception个。

答案 2 :(得分:1)

通过对类对象使用Reflection来获取Method对象。

然后通过提供您希望他们操作的对象以及您希望提供的任何参数来调用它们。

阅读反思教程可能是个好主意:http://docs.oracle.com/javase/tutorial/reflect/

答案 3 :(得分:1)

你可以像这样在你的类中声明一个方法:

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

    public static void main(String... args)
    {
        Method methodA = getClass().getDeclaredMethod("a");
    }
}

答案 4 :(得分:1)

  • 您需要拥有所有方法的返回类型(除了 构造函数),如public static void b (){}
  • lst.add(1, a());将调用该方法并尝试将该方法的返回值添加到给定索引处的列表中。
  • 此外,您需要遵循java命名约定(如类名称应始终以大写字母开头)

如果您要添加Method,则需要使用反射list.add(a.class.getMethod("b"));