具有一定注释并实现某种界面的所有类

时间:2017-08-14 13:37:38

标签: java reflection

我正在使用org.reflections在多模块应用程序中查找某些类。

我能够找到所有正在实现某个接口的类:

Reflections reflections = new Reflections("my.package");    
Set<Class<? extends MyInterface>> ddd = reflections.getSubTypesOf(MyInterface.class);

我能够找到所有具有特定注释的类。

Reflections reflections = new Reflections("my.package");
Set<Class<?>> classes = reflections.getTypesAnnotatedWith(MyAnnotation.class);

但是,我无法找到一种方法来查找正在实现该接口并具有所需注释的所有类。

我如何结合这两种方法? 它甚至可能吗?

2 个答案:

答案 0 :(得分:2)

你可以像实际那样检索两者 然后通过在两个集合中的一个上调用Set.retainAll()方法并将另一个作为参数传递来保持两者的交集。

  

boolean retainAll(Collection c);

     

仅保留此集合中包含的元素   指定集合(可选操作)。换句话说,删除   从此设置所有未包含在其中的元素   指定的集合。如果指定的集合也是一个集合,那么这个   操作有效地修改了这个集合,使其值为   两组的交集。

例如试试吧:

Reflections reflection = new Reflections("my.package");
Set<Class<? extends MyInterface>> matchingClasses = reflection.getSubTypesOf(MyInterface.class);    
Set<Class<?>> annotationClasses = reflection.getTypesAnnotatedWith(MyAnnotation.class);

matchingClasses.retainAll(annotationClasses);

因此,allClasses将仅包含两个集合中存在的Class个实例。

答案 1 :(得分:1)

你已经有两套了。为什么不使用它们并进行一些设置操作呢?

ddd包含所有实现MyInterface的类。 classes包含标有MyAnnotation的所有类。我希望所有满足这两个标准的课程。您可能应该知道现在需要什么样的设置操作 - 交叉。

在Java Set中,没有unionintersectionsubtract方法。要做一个交叉点,你应该调用retainAll,所以:

 ddd.retainAll(classes)

是你需要的。