使用RetentionPolicy_SOURCE实现代码检查工具

星宇吖_4215

星宇吖_4215

2026-04-07

294人浏览

原创

source注解无法用于运行时代码检查,因其仅保留在源码阶段,编译后即从class文件中丢弃,反射和字节码工具均不可见;正确做法是配合注解处理器在编译期使用。

使用retentionpolicy_source实现代码检查工具

RetentionPolicy.SOURCE 无法用于运行时代码检查,因为它只保留在源码阶段,编译后即被丢弃,无法在编译后或运行时读取。

为什么 SOURCE 注解不能做代码检查

Java 注解的保留策略决定了它在哪个阶段可用:

  • SOURCE:仅在源码中存在,javac 编译时可用,但不会写入 .class 文件,编译后彻底消失
  • CLASS:写入字节码,但 JVM 加载时不加载,反射不可见
  • RUNTIME:写入字节码且 JVM 加载后可通过反射获取——这是运行时检查(如 Spring、JUnit)依赖的基础

因此,任何需要在编译后分析代码的工具(如自定义注解处理器、静态检查、字节码扫描、运行时 AOP 或校验逻辑),都不能依赖 SOURCE 级注解。

想做代码检查?该用 PROCESSOR + CLASS 或 RUNTIME

真正可行的路径是使用 注解处理器(Annotation Processor),它在编译期(javac 执行时)工作,能读取 SOURCE 级注解并生成提示、文件或报错:

  • 注解声明需加 @Retention(RetentionPolicy.SOURCE) 和 @Target
  • 编写 javax.annotation.processing.Processor 子类,在 process() 中遍历 AST(通过 RoundEnvironment 获取元素)
  • 用 Messager 输出警告/错误(如 messager.printMessage(Diagnostic.Kind.ERROR, "...", element))
  • 注册处理器:在 META-INF/services/javax.annotation.processing.Processor 中写入全限定类名

例如:定义 @DeprecatedApi(SOURCE 级),注解处理器扫描到该注解出现在非废弃方法上调用时,直接报编译错误。

常见误解与替代方案

有人试图用 SOURCE 注解配合反射或字节码库(如 ASM)做检查——这注定失败,因为注解信息已不存在于 class 文件中。

  • 若需构建期检查(如 Maven 编译时),用注解处理器(Processor)+ SOURCE 是正解
  • 若需运行时校验(如参数合法性),必须用 RUNTIME,并配合反射或代理
  • 若需 IDE 实时提示(如 IntelliJ 警告),可结合注解处理器 + IDE 的 Annotation Tooling 支持,或使用 Lombok-style 插件机制

小结

RetentionPolicy.SOURCE 的唯一正确定位是“编译期元数据”,服务于注解处理器。把它当作运行时检查的入口,会因信息丢失而失效。工具链设计要匹配生命周期:SOURCE → Processor;RUNTIME → Reflection/AOP;CLASS → 字节码分析(如 Checkstyle 集成版、ArchUnit)。选错保留策略,整个检查逻辑就失去基础。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2025.08.06

2291

22

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

2026.01.26

437

25

Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

2025.09.15

3120

19

Java Maven/Gradle 构建与依赖管理合集
Java Maven/Gradle 构建与依赖管理合集

系统讲解 Java 项目构建工具的使用与进阶配置,涵盖 Maven 的 POM 文件结构、生命周期(clean/compile/package/install/deploy)与插件机制、依赖范围(compile/provided/test/runtime)与传递依赖管理、多模块聚合与继承、私有 Nexus 仓库发布,以及 Gradle 的 Groovy / Kotlin DSL 语法、Task 自定义与增量构建、依赖版本目录(Versi

2026.05.09

329

25

软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

2023.10.13

4210

8

java测试工具有哪些
java测试工具有哪些

java测试工具有JUnit、TestNG、Mockito、Selenium、Apache JMeter和Cucumber。php还给大家带来了java有关的教程,欢迎大家前来学习阅读,希望对大家能有所帮助。

2023.10.23

2601

10

Java 单元测试
Java 单元测试

本专题聚焦 Java 在软件测试与持续集成流程中的实战应用,系统讲解 JUnit 单元测试框架、Mock 数据、集成测试、代码覆盖率分析、Maven 测试配置、CI/CD 流水线搭建(Jenkins、GitHub Actions)等关键内容。通过实战案例(如企业级项目自动化测试、持续交付流程搭建),帮助学习者掌握 Java 项目质量保障与自动化交付的完整体系。

2025.10.24

1006

26

软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

2023.10.13

4210

8

java测试工具有哪些
java测试工具有哪些

java测试工具有JUnit、TestNG、Mockito、Selenium、Apache JMeter和Cucumber。php还给大家带来了java有关的教程,欢迎大家前来学习阅读,希望对大家能有所帮助。

2023.10.23

2601

10

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习