Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法和数组列表的清晰性_Java_Collections_Arraylist - Fatal编程技术网

Java 方法和数组列表的清晰性

Java 方法和数组列表的清晰性,java,collections,arraylist,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,

我想学习如何创建方法的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 class MyClass {
    public void a() {
        System.out.println("A!");
    }

    public static void main(String... args)
    {
        Method methodA = getClass().getDeclaredMethod("a");
    }
}
  • 所有方法都需要返回类型(除 构造函数),比如
    公共静态void b(){}
  • lst.add(1,a())
    将只调用该方法,并尝试将该方法的返回值添加到给定索引处的列表中
  • 此外,您还需要遵循java命名约定(比如类名应始终以大写字母开头)

如果您想添加
方法
,则需要使用反射
list.add(a.class.getMethod(“b”)

从Java 7开始,您不能像这里所做的那样将方法视为变量。您需要使用反射来访问表示方法的
方法
对象。使用
a
类上的来检索适当的
方法
对象,您可以
将其添加到
数组列表

将collection参数中的所有元素添加到要调用的集合
addAll
。如果要调用,那么
集合本身就是下一个新元素


要调用由
方法表示的方法,请调用。小心,
getMethod
invoke
方法都会抛出它们自己的
异常,您必须捕获这些异常。

如果您想使用反射,您应该使用
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();
}
公共静态Foo a=新Foo(){
公屋{
//在这里做“a”字。
}
}
公共静态Foo b=新Foo(){
公屋{
//在这里做“b”字。
}
}
...
公共静态Foo e=新Foo(){
公屋{
//在这里做“e”字。
}
}
公共静态void main(字符串[]arg){
ArrayList lst=新的ArrayList();
第1条增补(1,a);
第1条增补(2,b);
第1条增补(3,c);
第1条增补(4,d);
第1条增补(5,e);
}

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

这里已经有一些正确的答案,但我想我要说明的是,除非性能是一个问题,否则这将非常适合您。使用Java反射比对真实对象进行实际方法调用慢三个数量级。如果遇到性能问题,您可能会考虑开发一个定义您希望调用的方法的接口,然后在该接口的实例中包装您想调用方法的任何对象。如果性能不是一个问题,那么听起来你已经完全解决了!
public class MyClass {
    public void a() {
        System.out.println("A!");
    }

    public static void main(String... args)
    {
        Method methodA = getClass().getDeclaredMethod("a");
    }
}
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);
}