java获取方法的集合

时间:2016-05-27 15:10:19

标签: java collections

我有一些辅助类用于测试,具有以下结构:

public class EntitiesForTest {
    public static Entity firstEntity() {
        return new Entity(/*some dummy data*/)
    }

    public static Entity secondEntity() {...}
    ...
    public static Entity nthEntity() {...}

    public static List<Entity> allEntities() {???}
}

这个类的目的是让一些对象来测试我系统的上层,比如有一些JSON数据来测试REST服务。这种技术不是我的,而是来自我正在进行的在线课程,非常酷。

我想知道是否有办法根据类的静态继承方法和集合框架构建List<Entity>。我可以做Arrays.asList(/*call the methods one by one comma-separated*/),但必须有一个更聪明,功能和可重复使用的方法。

提前感谢您的回答。

4 个答案:

答案 0 :(得分:1)

&#34;现代&#34;方式

public static List<Entity> getEntities() {
    return Arrays.stream(Foo.class.getMethods()).
            filter(method -> method.getReturnType() == Entity.class && 
                             Modifier.isStatic(method.getModifiers())).
            map(method -> {
                try {
                    return (Entity)method.invoke(null);
                } catch (IllegalAccessException | InvocationTargetException e) {
                    throw new RuntimeException(e); // exceptions in streams... lol
                }
            }).
            collect(Collectors.toList());
}

我希望我知道避免演员表的方法,但这对我来说并不是很清楚。

答案 1 :(得分:0)

这是用于调用EntitiesForTest类的指定方法并收集返回对象的相同代码:

public static List<Entity> allEntities() {
    ArrayList<Entity> list = new ArrayList<Entity>();
    Method[] ma = EntitiesForTest.class.getMethods();
    Object[] emptyObject = new Object[0];
    for (int i = 0; i < ma.length; i++) {
        if (ma[i].getReturnType().equals(Entity.class) && 
                ma[i].getParameterTypes().length == 0 && 
                Modifier.isStatic(ma[i].getModifiers())) {
            try {
                Entity e = (Entity)(ma[i].invoke(null, emptyObject));
                list.add(e);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    return list;
}

答案 2 :(得分:0)

这个答案有几个假设:

  • 您不需要个别方法(cfirstEntity等)。
  • 实体只保存数据,并且创建和保存并不昂贵
  • 您不需要修改它们,这意味着您不会多次调用您的方法。

这些可能不成立,因为我们没有secondEntity的定义或它是如何使用的。

总而言之,我只是删除你的方法。

Entity

答案 3 :(得分:0)

也许使用功能方式(在java 8中)?

public class Entities {

    static class Entity{
        private String x;
        Entity( String x){
            this.x = x;
        }
        public String getX(){
            return x;
        }
    }

       public static Entity firstEntity() { 
           return new Entity("first Entity");
        }
       public static Entity secondEntity() {  
           return new Entity("second Entity");
        }
        public static Entity nthEntity() {
            return new Entity("nth Entity");}

        @FunctionalInterface interface  GetEntity{
            public Entity getEntity();
        }

        public static List<GetEntity> allEntities  = 
             Arrays.asList(Entities::firstEntity, 
                           Entities::secondEntity,
                           Entities::nthEntity);

        public static void main(String ...p){
            allEntities
                .stream()
                .forEach(x->{System.out.println(x.getEntity().getX());});
        }
}