如何在javax.lang.model层级中获取参数类型使用注解@A?
如何获取参数类型上TYPE_USE注解的AnnotationMirror?
先看定义的代码:
@Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.TYPE_USE }) // 注意:无PARAMETER public @interface A {} public final class B { // @A标注的是String类型的使用,而非参数元素s private static final void c(@A String s) {} }
已确认B的.class文件中,@A作为运行时可见的类型使用注解存在。
执行以下代码获取目标方法:
javax.lang.model.element.Element e = elements.getTypeElement("B"); javax.lang.model.element.ExecutableElement c = (javax.lang.model.element.ExecutableElement)e.getEnclosedElements().get(1); // 验证获取到了正确的方法 assert c.getSimpleName().contentEquals("c");
问题:如何获取String类型上@A对应的AnnotationMirror?
尝试过以下方法均未找到该注解:
c.getParameters().get(0).getAnnotationMirrors();:符合预期,因为注解标注在类型而非参数元素本身c.getParameters().get(0).asType().getAnnotationMirrors();:未找到,原因是asType()返回的是String的基础DeclaredType,不包含类型使用场景的注解((javax.lang.model.type.ExecutableType)c.asType()).getParameterTypes().get(0).getAnnotationMirrors();:未找到,因为ExecutableType的参数类型同样是基础类型镜像,不携带类型使用注解
解决方案:使用Types.asAnnotatedType()获取带注解的类型镜像
要读取ElementType.TYPE_USE类型的注解,需要借助javax.lang.model.util.Types工具类的asAnnotatedType()方法,将普通的TypeMirror转换为AnnotatedType——这个类型专门用于携带类型使用场景的注解信息。
示例代码:
import javax.lang.model.type.AnnotatedType; import javax.lang.model.util.Types; import java.util.List; // 假设已通过ProcessingEnvironment获取到Types实例types VariableElement paramElement = c.getParameters().get(0); AnnotatedType annotatedParamType = types.asAnnotatedType(paramElement.asType()); List<? extends AnnotationMirror> typeUseAnnotations = annotatedParamType.getAnnotationMirrors(); // 遍历即可获取@A的AnnotationMirror for (AnnotationMirror mirror : typeUseAnnotations) { if (mirror.getAnnotationType().toString().equals("A")) { // 找到目标注解 break; } }
补充说明
TypeMirror仅表示类型本身的信息,不包含该类型在具体使用场景中附加的注解AnnotatedType是Java 8引入的类型,专门用于承载TYPE_USE注解,只有通过Types.asAnnotatedType()才能获取到包含这类注解的实例
内容的提问来源于stack exchange,提问作者Laird Nelson
相关产品推荐
相关产品推荐

