java - Java Custom Annotation 的处理器代码什么时候调用?(运行时保留)
问题描述
我知道自定义 Java 注释需要一个半接口声明@interface
和一个处理器代码(在某些文本中称为消费者代码),它定义了注释背后的实际业务逻辑。到目前为止很清楚,但我的问题是,处理器代码在何处/何时被调用以及由谁调用?我的意思是,Java 编译器是否生成调用所有注释处理器的代码,例如,在类加载时?还是程序员自己决定何时为他们的自定义注释调用他们的处理器代码?例如,@GetMapping("/users")
在某些方法上,告诉 servlet API 将请求映射到其请求路径中的 /users,应该传递给该方法。所以它在幕后有一些应该被调用的处理器将此映射配置存储在某处,但是何时以及谁调用该处理器?我想我的问题只有在注释上才有意义@Retention(RetentionPolicy.RUNTIME)
。谢谢
解决方案
注释处理器在编译时运行。调用javac
时,用户传递-processor
命令行选项,然后javac
调用处理器。注释处理器可以发出错误、创建文件(包括 Java 代码文件),甚至修改现有代码。除了上面链接的 Oracle 文档之外,您可能还想查看教程,例如Baeldung 的.
有些框架直接解释注解,所以你不需要编写自己的注解处理器。
为了影响运行时行为,您的代码可以反射性地读取注释;在这种情况下,没有注释处理器在编译时运行。
推荐阅读
- python-3.x - 成功安装 python-weka-wrapper 后无法使用 weka.core 模块“没有名为'weka.core'的模块”
- imshow - cv2.imshow() 图像较小时无法正常工作
- c# - Azure DevOps Pipeline - 绕过强名称验证
- loops - 如何遍历递归/嵌套哈希图中的所有键?
- sql - 计算 SQL 中特定值的重复次数
- amazon-web-services - Terraform:带双堡垒的连接块
- java - 使用 Java 程序在 Azure 服务总线队列中接收待处理消息?
- xero-api - 我可以在没有 pfx 文件的情况下使用 XeroCoreApi 连接到私有应用程序吗?
- firebase - 如何安全地将基于时间的凭据传递给谷歌云功能?
- c# - 启用 Unity 中另一个场景中存在的游戏对象?