0

0

Java注解处理器中获取类型使用(TYPE_USE)注解的正确途径

花韻仙語

花韻仙語

发布时间:2026-02-25 15:05:01

|

829人浏览过

|

来源于php中文网

原创

Java注解处理器中获取类型使用(TYPE_USE)注解的正确途径

在Java注解处理过程中,@Target(TYPE_USE) 注解(如 @A String s 中对 String 的标注)无法通过标准 javax.lang.model API(如 VariableElement.asType().getAnnotationMirrors())获取——这不是设计疏漏,而是 JDK 长期存在的已知 Bug(JDK-8225377),截至 JDK 21 仍未修复。

java注解处理过程中,`@target(type_use)` 注解(如 `@a string s` 中对 `string` 的标注)无法通过标准 `javax.lang.model` api(如 `variableelement.astype().getannotationmirrors()`)获取——这不是设计疏漏,而是 jdk 长期存在的已知 bug(jdk-8225377),截至 jdk 21 仍未修复。

当开发者在方法参数中使用类型使用注解(例如 private static void c(@A String s)),该注解语义上修饰的是「String 类型的使用位置」,而非参数变量本身(s)或其声明类型(String.class 的 DeclaredType)。按照 JSR 269 和 javax.lang.model 规范的设计意图,这类注解应可通过类型对象的 getAnnotationMirrors() 方法访问。然而,实际运行时:

  • c.getParameters().get(0).getAnnotationMirrors() → 返回空(正确,因 @A 不是 PARAMETER 目标);
  • c.getParameters().get(0).asType().getAnnotationMirrors() → 返回空(不符合预期,属实现缺陷);
  • ((ExecutableType) c.asType()).getParameterTypes().get(0).getAnnotationMirrors() → 同样返回空(进一步印证 API 路径失效)。

这并非 API 使用错误,而是 OpenJDK 中一个自 Java 12 引入完整 TYPE_USE 支持后即存在的深层实现问题。官方 Bug 报告 JDK-8225377 明确指出:javax.lang.model.type.TypeMirror.getAnnotationMirrors() 在涉及类型使用注解时始终忽略 TYPE_USE 位置的注解镜像,导致注解处理器无法以标准方式读取它们。

替代方案与实践建议

目前无标准、跨 JDK 版本兼容的 javax.lang.model 解决方案。若必须提取 TYPE_USE 注解,可考虑以下路径(按推荐度排序):

Gatekeep
Gatekeep

Gatekeep AI是一个专注于将文本转化为教学视频的智能教学工具,主要用于数学和物理等学科的教育。

下载
  1. 使用 com.sun.source.tree(JSR 199 编译器树 API)
    在 AbstractProcessor.process() 中通过 Trees.getTreePath() 获取语法树节点,再遍历 MethodTree → VariableTree → Tree.getType() → AnnotatedTypeTree,从中提取 AnnotationTree。需引入 jdk.compiler 模块依赖,且属于非标准 SPI,不保证长期稳定。

  2. 解析字节码(如 ASM 或 Byte Buddy)
    在编译期或后续阶段读取 .class 文件的 RuntimeVisibleTypeAnnotations 属性。适用于构建插件或高级 APT 工具,但脱离了注解处理器的纯 javax.lang.model 上下文。

  3. 规避设计:改用 @Target({ElementType.PARAMETER, ElementType.TYPE_USE})
    若业务允许,为注解同时声明 PARAMETER 目标,则可通过 VariableElement.getAnnotationMirrors() 可靠获取——这是最轻量、可移植的变通方案,但会改变注解语义(可能引入误用风险)。

注意事项

  • ✅ TYPE_USE 注解在运行时(Class.getDeclaredMethod(...).getAnnotatedParameterTypes())可被正确反射获取,问题仅存在于编译期注解处理阶段
  • ❌ 不要尝试重写 TypeMirror 子类或反射修改内部字段——javax.lang.model 实现为不可变只读视图;
  • ⚠️ JDK 17+ 的 --enable-preview 或 --source 21 不影响此 Bug 状态;该问题独立于语言版本演进。

综上,面对 TYPE_USE 注解的编译期读取需求,开发者应清醒认知:这不是能力缺失,而是平台限制。优先采用双目标注解策略;对强类型安全有硬性要求的场景,建议结合字节码分析构建健壮的元数据管道。

立即学习Java免费学习笔记(深入)”;

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.02

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.02

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

183

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

125

2025.11.27

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

707

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

22

2025.12.06

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

127

2026.02.25

Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法
Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法

本专题系统整理Steam官网最新可用入口,涵盖网页版登录地址、新用户注册流程、账号登录方法及官方游戏商店访问说明,帮助新手玩家快速进入Steam平台,完成注册登录并管理个人游戏库。

18

2026.02.25

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

15

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.9万人学习

C# 教程
C# 教程

共94课时 | 10.2万人学习

Java 教程
Java 教程

共578课时 | 71.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号