我有两个注释:
@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。我能这样做吗?怎么样?
答案 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);