当前位置: 首页 > 知识库问答 >
问题:

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

艾灿
2023-03-14

我知道自定义Java注释需要一个带有@接口的半接口声明和一个处理器代码(在某些文本中称为消费者代码),处理器代码定义注释背后的实际业务逻辑。到目前为止很清楚,但我的问题是,处理器代码在哪里/什么时候被调用,由谁调用?我的意思是,Java编译器是否生成调用所有注释处理器的代码,例如,在类加载时?或者程序员自己决定何时调用处理器代码进行自定义注释?例如,在某个方法上,告诉servlet API将请求映射为请求路径中的 /users,应该传递给这个方法。所以它在场景后面有一些处理器,应该被调用来存储这个在某个地方映射配置,但是什么时候谁调用那个处理器?我想我的问题只有在注释中才有意义,注释中有@Resention策略。运行时间)。谢啦

共有2个答案

璩和璧
2023-03-14

注释处理器在编译时运行。调用javac时,用户传递-processor命令行选项,然后javac调用处理器。注释处理器可以发出错误,创建文件(包括Java代码文件),甚至修改现有代码。除了上面链接的Oracle文档之外,您可能还想看看教程,例如Baeldung的。

有些框架直接解释注释,因此您不需要编写自己的注释处理器。

为了影响运行时行为,您的代码可以反射地读取注释;在这种情况下,编译时不会运行注释处理器。

朱淮晨
2023-03-14

顾名思义,注释是附加信息(或行为)。默认情况下,此信息不会被处理或用于更改任何行为。必须有一些实体来处理注释。

保留策略告诉Java编译器注释的范围。也就是说,是否需要在运行时或编译时处理额外的信息。

对于编译时处理,使用-processor标志将注释处理器连接到编译过程中。对于运行时处理,反射(如此)用于访问附加信息。

@在某个方法上的GetMapping(“/users”)告诉servlet API将请求映射到其请求路径中的/users,

仅注释的存在不会导致这种行为。spring框架(简化了很多)-

  • 将自身安装为/*的servlet终结点。请参见FrameworkServlet
  • 枚举使用反射
  • 注释的方法
  • 使用带注释的信息来填充URL到方法的映射。
  • 在处理请求时,使用映射路由到预期的方法。

理解流程的一个简单技巧(是的,Java有时太神奇了)是安装断点并查看调用堆栈。

 类似资料:
  • 我使用抽象处理器创建了一个自定义注释和注释处理器。这意味着我想在编译之前进行注释处理。我将自定义注释和处理器导出为Jar,并尝试将其与简单的java测试程序一起使用。我确信在编译时它会找到我的java处理器类,但不知何故,我并没有得到我在控制台上期望的o/p。下面是我的处理器中处理方法的代码。 此外,我故意使用以便我得到一个版本警告,它确认当我执行一个测试类时,它找到了我的注释处理器。 这里是我的

  • 在META-INF/Services中,添加了javax.annotation.processing.processor条目,指定自定义注释处理器类。

  • 我试图在Karaf中定义和使用自定义运行时注释。它不适合我。 我可以将包配置为使用Pax CDI OpenWebBeans CDI容器。集装箱很好用。我可以看到公开的服务(standard annotation@OsgiServiceProvider)。 但对于已定义的@AroundInvoke方法的自定义拦截器标记,它不处理使用自定义注释方法进行注释的拦截器标记。 我使用apache-karaf

  • 建筑格拉德尔 注释 加工机 \资源\META-INF\javax.annotation.processing.处理器 注释消费者 建筑格拉德尔 这应该是一个非常简单的注释处理器,只是打印调试语句。对我来说,这一切似乎都是正确的,但是在我构建/运行项目2时没有运行。我也尝试过覆盖和。那没有做任何事情。也尝试过没有,那也没有改变任何事情。 编辑:为什么我可以获得

  • 问题内容: 我想编写自己的Web安全模块库,但无法解决问题。例; 我有一堂课,有一种方法。方法有我的自定义注释。 当此方法调用时,如何触发我的注释。 (示例; Hibernate验证程序。我们在method上编写了hibernate批注,它仅在被调用的方法上起作用) 顺便说一句我的英语不好:) 问题答案: 注释不是“触发的” …您必须编写代码来查找它们的存在并采取措施。 “代码”可以在运行时执行,

  • 我正在尝试编写一个注释处理器来插入类上的方法和字段......留档如此稀疏。我走不远,我不知道我是否正确地接近它。 处理环境提供了一个对象,它具有创建新源文件和类文件的方便方法。这些工作正常,但后来我试图弄清楚如何读取现有源文件,它提供的只是“getResources”。所以在我的处理器实现中,我这样做了: 我的第一个困惑是我不禁觉得(获取合格的类型名称并将其转换为包和源文件路径)不是解决问题的好