我知道自定义Java注释需要一个带有@接口
的半接口声明和一个处理器代码(在某些文本中称为消费者代码),处理器代码定义注释背后的实际业务逻辑。到目前为止很清楚,但我的问题是,处理器代码在哪里/什么时候被调用,由谁调用?我的意思是,Java编译器是否生成调用所有注释处理器的代码,例如,在类加载时?或者程序员自己决定何时调用处理器代码进行自定义注释?例如,在某个方法上,告诉servlet API将请求映射为请求路径中的 /users,应该传递给这个方法。所以它在场景后面有一些处理器,应该被调用来存储这个在某个地方映射配置,但是什么时候谁调用那个处理器?我想我的问题只有在注释中才有意义,注释中有@Resention策略。运行时间)
。谢啦
注释处理器在编译时运行。调用javac
时,用户传递-processor
命令行选项,然后javac
调用处理器。注释处理器可以发出错误,创建文件(包括Java代码文件),甚至修改现有代码。除了上面链接的Oracle文档之外,您可能还想看看教程,例如Baeldung的。
有些框架直接解释注释,因此您不需要编写自己的注释处理器。
为了影响运行时行为,您的代码可以反射地读取注释;在这种情况下,编译时不会运行注释处理器。
顾名思义,注释是附加信息(或行为)。默认情况下,此信息不会被处理或用于更改任何行为。必须有一些实体来处理注释。
保留策略告诉Java编译器注释的范围。也就是说,是否需要在运行时或编译时处理额外的信息。
对于编译时处理,使用-processor
标志将注释处理器
连接到编译过程中。对于运行时处理,反射(如此)用于访问附加信息。
@在某个方法上的GetMapping(“/users”)告诉servlet API将请求映射到其请求路径中的/users,
仅注释的存在不会导致这种行为。spring框架(简化了很多)-
/*
的servlet终结点。请参见FrameworkServlet理解流程的一个简单技巧(是的,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批注,它仅在被调用的方法上起作用) 顺便说一句我的英语不好:) 问题答案: 注释不是“触发的” …您必须编写代码来查找它们的存在并采取措施。 “代码”可以在运行时执行,
我试图弄清楚使用运行时级别保留注释(例如:@javax.inject.named)注释的类在编译时和运行时类路径方面的确切影响。这是我到目前为止的理解: null 如果是这种情况,我是否需要创建一个包装对象(用@javax.inject.named注释)来委托内部的、未注释的对象?是否还有一个在编译时禁用注释处理的选项?参见http://docs.oracle.com/javase/7/docs/