You need to enable JavaScript to run this app. 运行时保留的Java自定义注解的处理器代码何时被调用?
优惠活动
大模型
产品
解决方案
定价
更多

运行时保留的Java自定义注解的处理器代码何时被调用?

核心结论

@Retention(RetentionPolicy.RUNTIME) 级别的自定义注解,处理器代码的调用时机和触发方完全由开发者/框架设计者自主决定,Java编译器、JVM默认不会自动生成、执行任何相关处理逻辑。

Java注解本质只是依附在类、方法、字段等结构上的元数据,本身没有任何执行能力。JVM仅负责将RUNTIME级别的注解保留到字节码中,并且在类加载完成后,允许你通过Java反射API读取到这些注解信息,不会主动触发任何针对注解的处理代码。

常见的RUNTIME注解处理器调用场景

  • 应用上下文初始化阶段:这是绝大多数框架注解的处理时机。比如Spring启动时会主动扫描指定包路径下的所有类,通过反射读取类、方法、字段上的注解,完成Bean注册、依赖注入、映射关系存储等初始化逻辑。
  • 业务运行时动态处理:部分切面类注解会在业务逻辑执行时触发处理。比如自定义的接口权限校验注解,会通过AOP拦截请求,读取方法上的注解配置判断当前调用者是否满足访问权限,再决定是否放行执行目标方法。
  • 自定义类加载阶段:你可以自行实现ClassLoader扩展,在类加载到JVM的过程中读取类上的RUNTIME注解做预处理,但这属于自定义扩展逻辑,不是JVM的默认行为。

@GetMapping的调用方与调用时机

以Spring MVC的实现为例:

  1. 调用方:Spring MVC内置的RequestMappingHandlerMapping组件
  2. 调用时机:Spring Web应用上下文初始化阶段,具体是在所有单例Bean实例化完成后,执行Bean初始化后置处理器逻辑时触发
  3. 执行流程:
    • 遍历所有标注了@Controller或@RestController的Bean实例
    • 反射读取这些类中所有方法上的@GetMapping、@PostMapping等请求映射注解
    • 解析注解中的请求路径、请求方法、参数绑定规则等配置,存入全局的请求映射注册表
    • 后续收到Servlet容器转发的HTTP请求时,直接从注册表中匹配对应的处理方法执行即可

补充误区纠正:你提到的「编译器调用注解处理器」是SOURCE和CLASS保留级别的注解的处理逻辑,这类注解的处理器是JDK javax.annotation.processing.Processor接口的实现类,在编译期由javac主动扫描调用,通常用来生成额外的类文件或者辅助代码,比如Lombok的注解就是编译期处理的,和RUNTIME注解的处理逻辑完全是两个流程。


内容的提问来源于stack exchange,提问作者mostafa.S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 10:15:07