在Java里注解是如何参与程序运行的_Java注解处理原理解析-java教程

Java注解本身是元数据,不参与运行;编译期通过@Retention(SOURCE)和AnnotationProcessor处理AST生成代码,运行期通过@Retention(RUNTIME)配合反射读取,但需注意生命周期、类加载器及语义约定。

Java 注解本身不参与运行,它们只是元数据;真正参与运行的是你写的 AnnotationProcessor(编译期)或通过反射读取注解的代码(运行期)。

注解怎么在编译期起作用:@Retention(RetentionPolicy.SOURCE) 和 AnnotationProcessor

这类注解只保留在源码阶段,比如 @Override、@SuppressWarnings。自定义时需配合 javax.annotation.processing.AbstractProcessor 实现编译期逻辑:

  • 必须声明 @SupportedAnnotationTypes 指定处理哪些注解
  • 不能在 processor 里用反射读取被注解的类——此时字节码还没生成,只能用 Element 和 TypeMirror API 分析 AST
  • 生成新文件要用 Filer.createSourceFile(),不能直接写磁盘
  • Maven 中需用 maven-compiler-plugin 配置 annotationProcessors,否则 processor 不会被触发

注解怎么在运行期起作用:@Retention(RetentionPolicy.RUNTIME)

只有标了 @Retention(RetentionPolicy.RUNTIME) 的注解才能被反射读到。关键点在于:

  • Class.getAnnotation(Class)、Method.getAnnotation(Class) 等方法返回的是代理对象,不是原始注解实例
  • 注解接口的方法不能有参数、不能抛异常、不能有默认值以外的实现(即所有方法都必须有 default 值)
  • 反射读取性能较低,频繁调用建议缓存结果,比如 Spring 就把 @RequestMapping 解析结果存在 HandlerMapping 中
  • 注意类加载器隔离问题:如果注解类由不同 ClassLoader 加载(如 OSGi 或某些容器),isAnnotationPresent() 可能返回 false,即使源码写了

常见踩坑:为什么我的注解“没生效”?

多数失效不是注解写错了,而是生命周期或使用方式不匹配:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 在Java里注解是如何参与程序运行的_Java注解处理原理解析-java教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3994400+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3994401+
  • 本周更新: 0+
  • 最后更新: 2026-03-16