在所有ArrayList <type>项上调用方法?

时间:2015-09-17 10:54:49

标签: java arraylist reflection

每次我想在arraylist上调用方法时,我希望能够调用

,而不是在外部使用foreach
ArrayList<String>.setText(); //Example.

我尝试使用反射,但我不确定如何实现它;

public class Array extends ArrayList
{
    public Array(Collection collection) {
        super(collection);
    }

    public void invokeMethod(String nameOfMethod, Object object)
    {
        for(int index = 0; index < size(); index++){
            get(index).getClass().getMethod(nameOfMethod, object.getClass());
        }

        //Example of a single object invocation.
        try {
            method = obj.getClass().getMethod(methodName, param1.class, param2.class, ..);
        } catch (SecurityException e) {
            // ...
        } catch (NoSuchMethodException e) {
            // ...
        }
    }
}

有谁知道如何实现这个?

2 个答案:

答案 0 :(得分:3)

Java 8已经提供了这种功能,因此尝试自己实现它是没有意义的。

例如:

ArrayList<SomeClass> list = ...;
list.forEach(o -> o.SomeMethod());

list.forEach(SomeClass::SomeMethod);

答案 1 :(得分:0)

您可以在Java 8之前构建自己的forEach。您只需要一个接口和匿名类。

import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String... args) {
        List<MyClass> list = new ArrayList<>();
        for(int i = 0; i < 10; i++) {
            list.add(new MyClass());
        }
        forEach(list, new Consumer<MyClass>() {
            @Override
            public void accept(MyClass t) {
                t.beep();
            }
        });
    }

    public static <T> void forEach(Iterable<T> iterable, Consumer<T> consumer) {
        for (T t : iterable) {
            consumer.accept(t);
        }
    }
}

interface Consumer<T> {
    void accept(T t);
}

class MyClass {

    public void beep() {
        System.out.println("beep");
    }
}