如何获取接口实现的注释 class

How to get the annotations of an interfaces implementation class

我想要一个 class PersonCollector 通过具有注释 PersonResolver[=47= 的特定 classes 注入一个字段]. PersonCollector 检查带注释的 class 是否有等于 PersonCollector.personType 字段的注释值。如果符合,逻辑将添加实现拥有此注释的 class 并将其分配给 PersonCollector.personByType 字段。

我的问题是,我有一个接口 Person 和两个实现 classes CoolPerson & UncoolPerson 都用 @PersonResolver 注释和一个用 Enum PersonType.[=15 指定其类型的值进行注释=]

寻找拥有特定接口的所有实现的唯一方法是调用 Person,即 Person.class.getAnnotations()。不幸的是,这只会产生在 Person 接口上声明的注释。

这不是我真正想要的。我想要一个列表,其中包含拥有注释的 Person 的所有 实现 - 而不是 Person 本身。

这是我想要实现的 pseudo/scratch 代码:

@PersonResolver

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface PersonResolver {
  PersonType value();
}

两种实现方式

@PersonResolver(PersonType.COOL)
public class CoolPerson implements Person {
  // implementation
}

@PersonResolver(PersonType.UNCOOL)
public class UncoolPerson implements Person {
  // implementation
}

个人收藏家

public class PersonCollector {
  private PersonType personType;
  private Person personByType;

  public PersonCollector(PersonType personType) {
    this.personType = personType; // PersonType.COOL

    Annotation[] annotations = Person.class.getDeclaredAnnotation(PersonResolver.class);

    // What I'd like to get are ALL classes that implement the "Person" interface
    // and have the "PersonResolver" Annotation.

    // PseudoCode!
    if (annotations[0].value == personType) {
      this.personByType = annotations[0].getClassThatImplementsMe(); // CoolPerson instance is assigned to the field
    }
  }
  // ...
}

您可以使用诸如 Reflections 之类的库,它会扫描类路径以查找使用 PersonResolver 注释的类型。例如,下面的代码将 return 一组 java.lang.Class 注释为 @PersonResolver,并且其 value() 属性等于 personType.

Reflections reflections = new Reflections(("com.myproject"));
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(PersonResolver.class)
        .stream()
        .filter(c -> c.getAnnotation(PersonResolver.class).value() == personType)
        .collect(Collectors.toSet());