如何获取接口实现的注释 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());
我想要一个 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());