【问题标题】:Clarity about Methods and ArrayList关于方法和 ArrayList 的清晰说明
【发布时间】:2014-01-27 23:37:48
【问题描述】:

我想了解如何创建方法的 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());

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

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

for (Method i : lst){
i;}

感谢您的热心帮助。

【问题讨论】:

  • 这里已经有几个正确的答案,但我只是想我会评论说,除非性能是一个问题,否则这对你来说非常有用。使用 Java 反射已被证明比对真实对象进行实际方法调用要慢三个数量级。如果您遇到性能问题,您可能会考虑开发一个接口来定义您希望调用的方法,然后在该接口的实例中包装您想要调用方法的任何对象。如果性能不是问题,听起来你已经搞定了!

标签: java collections arraylist


【解决方案1】:

如果你想使用反射,你应该使用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);
}

然后要调用该函数,您可以在列表中的每个Foo 对象上调用doFoo()

【讨论】:

    【解决方案2】:

    从 Java 7 开始,您不能像在此处那样将方法视为变量。您需要使用反射来访问表示该方法的Method 对象。使用a 类上的getMethod method 检索正确的Method 对象,您可以将其add 传递给您的ArrayList

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

    要调用由Method 表示的方法,请调用invoke method。小心,getMethodinvoke 方法都会抛出它们自己的 Exceptions,你必须抓住它们。

    【讨论】:

      【解决方案3】:

      您可以通过对类对象使用反射来获取 Method 对象。

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

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

      【讨论】:

        【解决方案4】:

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

        public class MyClass {
            public void a() {
                System.out.println("A!");
            }
        
            public static void main(String... args)
            {
                Method methodA = getClass().getDeclaredMethod("a");
            }
        }
        

        【讨论】:

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

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

          【讨论】:

            猜你喜欢
            • 2021-11-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多