如何在另一个注释中获取带注释的元素?

时间:2018-01-03 05:52:57

标签: java reflection annotations

我有两个注释:

@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface A {
    Parameter[] parameters() default {};
    //other methods
}


@Retention(RetentionPolicy.CLASS)
@Target(ElementType.FIELD)
public @interface Parameter {
    Class<?> parameterClass();
}

像这样使用:

@A(parameters = @Parameter(parameterClass = Integer.class))
public class C{}

我可以使用列注释获取元素:

Set<? extends Element> annotatedElements = roundEnvironment.getElementsAnnotatedWith(A.class);
Set<TypeElement> types = ElementFilter.typesIn(annotatedElements);
for (TypeElement e : types) {
    A a = e.getAnnotation(A.class);
    //do something...
    //I can get Parameters:
    Parameter[] parameters = a.parameters();
    ...
}

但我无法直接从参数获取parameterClass。所以我需要获取Element / AnnotationMirror。我能这样做吗?怎么样?

1 个答案:

答案 0 :(得分:0)

类对象可能无法在当前编译期间编译,因此它可能会抛出MirroredTypeException。您可以从例外中获取TypeMirro

这是我的实用方法:

  public static <T extends Annotation> TypeMirror getAnnotationClassValue(Elements elements, T anno,
      Function<T, Class<?>> func) {
    try {
      return elements.getTypeElement(func.apply(anno).getCanonicalName()).asType();
    } catch (MirroredTypeException e) {
      return e.getTypeMirror();
    }
  }

你可以做到

Parameter p = parameters[0];
TypeMirror tm = getAnnotationClassValue(elements, p, Parameter::parameterClass);