我需要创建一个自定义注释,当该注释应用于方法时,会根据各种检查检查并验证输入参数(原始和非原始)。如果检查失败应该直接返回错误消息。
在搜索时,我在创建自定义注释时遇到了 AbstractProcessor 和 ConstraintValidator 的使用。作为创建自定义注释的新手,我想了解如何继续实现我的问题陈述。
最佳答案
首先,您需要明白您正在谈论两件不同的事情。
TL;DR:编译时与运行时 - 你需要运行时
<小时/>注释处理器是一个抽象术语,用于标识在编译时运行的进程,并且能够扫描源文件,即具有 .java
的源文件扩展名。
注释处理器实现可能会根据任意检查抛出警告,甚至错误以停止编译任务。
示例:“我注意到有人向我的方法传递了 null
值,这是一个错误!停止一切!”
实现注释处理器的起点是 AbstractProcessor
基类,或 Processor
接口(interface) ( documentation )。
与 ConstraintValidator
实现不同,您还需要通过处理器元数据文件显式注册它,该文件必须位于生成的 JAR
工件内的标准目录下。
META-INF/services/javax.annotation.processing.Processor
创建注释处理器所需的内容已包含在标准 JDK 中。您不需要外部依赖项。
<小时/>另一方面, ConstraintValidator
标识与 Validation API 模块一起提供的接口(interface),位于包 javax.validation
下。此 API 有不同的实现,但最常用的是 Hibernate Validator
( documentation )。
该接口(interface)提供的验证是在运行时验证的。
与注释处理器不同,验证 API 实现必须手动提供,例如
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.15.Final</version>
</dependency>
<小时/>
你写的
when applied over a method checks and validates the input parameters (Primitive and non-primitive) against various checks
看来您需要编写运行时检查,这意味着验证 API 才是正确的选择。
关于java - 创建自定义注释时 AnnotationProcessor 与 ConstraintValidator 有什么用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54969743/