You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:50:17