Java javax.annotation.processing.Processor (注解处理器)

概念

注解处理器(Annotation Processor)是javac内置的一个用于编译时扫描和处理注解(Annotation)的工具。简单的说,在源代码编译阶段,通过注解处理器,我们可以获取源文件内注解(Annotation)相关内容javax.annotation.processing.Processor用于替换JDK6之前的APT(Annotatino Processing Tool)

用途

由于注解处理器可以在程序编译阶段工作,所以我们可以在编译期间通过注解处理器进行我们需要的操作。比较常用的用法就是在编译期间获取相关注解数据,然后动态生成.java源文件(让机器帮我们写代码),通常是自动产生一些有规律性的重复代码,解决了手工编写重复代码的问题,大大提升编码效率。

技术

javax.annotation.processing.Processor

public interface Processor {
   //返回此 processor 识别的选项。处理工具的实现必须提供一种方式来传递特定于 processor 的选项,这些选项不同于传递给工具自身的选项,
    Set<String> getSupportedOptions();
//返回此 processor 支持的注释类型的名称。结果元素可能是某一受支持注释类型的规范(完全限定)名称。它也可能是 "name.*" 形式的名称,表示所有以 "name." 开头的规范名称的注释类型集合。最后,"*" 自身表示所有注释类型的集合,包括空集。注意,processor 不应声明 "*",除非它实际处理了所有文件;声明不必要的注释可能导致在某些环境中的性能下降。
    Set<String> getSupportedAnnotationTypes();

//用于指定你的java版本,一般返回:SourceVersion.latestSupported()
    SourceVersion getSupportedSourceVersion();

//用处理环境初始化处理器。
    void init(ProcessingEnvironment processingEnv);

   //处理先前 round 产生的类型元素上的注释类型集,并返回这些注释是否由此 processor 声明。如果返回 true,则这些注释已声明并且不要求后续 processor 处理它们;如果返回 false,则这些注释未声明并且可能要求后续 processor 处理它们。processor 可能总是返回相同的 boolean 值,或者可能基于所选择的标准而返回不同的结果。
如果 processor 支持 "*" 并且根元素没有注释,则输入集合将为空。processor 必须妥善处理空注释集。

    boolean process(Set<? extends TypeElement> annotations,
                    RoundEnvironment roundEnv);
quot;),
     
    Iterable<? extends Completion> getCompletions(Element element,
                                                  AnnotationMirror annotation,
                                                  ExecutableElement member,
                                                  String userText);
}

javax.annotation.processing.AbstractProcessor

对其父类的获取配置信息的扩充,使其获取支持的版本号,扫描的注解信息等可以使用注解方式等,推荐使用

javax.annotation.processing.SupportedSourceVersion 直接支持的版本
javax.annotation.processing.SupportedOptions 支持的选项参数名称。通过getOptions方法获取选项参数值
javax.annotation.processing.SupportedAnnotationTypes 支持的注解 
 public Set<String> getSupportedOptions() {
        SupportedOptions so = this.getClass().getAnnotation(SupportedOptions.class);
        if  (so == null)
            return Collections.emptySet();
        else
            return arrayToSet(so.value());
    }

  public Set<String> getSupportedAnnotationTypes() {
            SupportedAnnotationTypes sat = this.getClass().getAnnotation(SupportedAnnotationTypes.class);
            if  (sat == null) {
                if (isInitialized())
                    processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING,
                                                             "No SupportedAnnotationTypes annotation " +
                                                             "found on " + this.getClass().getName() +
                                                             ", returning an empty set.");
                return Collections.emptySet();
            }
            else
                return arrayToSet(sat.value());
        }
 public SourceVersion getSupportedSourceVersion() {
        SupportedSourceVersion ssv = this.getClass().getAnnotation(SupportedSourceVersion.class);
        SourceVersion sv = null;
        if (ssv == null) {
            sv = SourceVersion.RELEASE_6;
            if (isInitialized())
                processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING,
                                                         "No SupportedSourceVersion annotation " +
                                                         "found on " + this.getClass().getName() +
                                                         ", returning " + sv + ".");
        } else
            sv = ssv.value();
        return sv;
    }

Demo

  • @SupportedAnnotationTypes(“org.mapstruct.Mapper”) 只支持org.mapstruct.Mapper注解
  • @SupportedAnnotationTypes(“javax.xml.bind.annotation.*”) 支持javax.xml.bind.annotation 包下所有注解
  • @SupportedAnnotationTypes("*") 支持所有注解
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这通常意味着你需要添加Lombok和Slf4j的依赖项到你的项目中。在Maven项目中,你可以在pom.xml文件中添加以下依赖项: ``` <dependencies> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope> </dependency> <!-- Slf4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> </dependencies> ``` 请注意,在Lombok的依赖项中,我们将作用域设置为“provided”,因为Lombok只是在编译时生成代码,而不是在运行时。而在Slf4j的依赖项中,我们添加了logback-classic作为实现,你也可以选择其他实现。 如果你正在使用Gradle,则可以将以下依赖项添加到build.gradle文件中: ``` dependencies { // Lombok compileOnly 'org.projectlombok:lombok:1.18.10' annotationProcessor 'org.projectlombok:lombok:1.18.10' // Slf4j implementation 'org.slf4j:slf4j-api:1.7.25' implementation 'ch.qos.logback:logback-classic:1.2.3' } ``` 同样,请注意在Lombok的依赖项中使用compileOnly和annotationProcessor来确保只在编译时使用它。 如果你已经添加了这些依赖项,但仍然收到“程序包lombok.extern.slf4j不存在”的错误消息,请确保在使用它之前,你已经重新构建了项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值