背景
今天用idea学习lombok时遇到一个问题,注解@Getter @Setter 编译通过通过struct视图也可以看到动态添加的 方法,但是运行时就会提示方法不存在。开始以为是依赖引入时机不对,调整后还是没有效果。百度一下需要这么操作:
此图为gradle依赖
作为常年使用eclipse的我觉得有必要搞搞清楚idea的这个AnnotionProcessor是个什么鬼东西了。
注解
(此图来自互联网)
AnnotionProcessor
首先并不是idea创造的东西,而是java提供的编译时注解处理机制。两种编译时解析方案
1. APT(Annotation Processing Tool)
2. Pluggable Annotation Processing API
APT
apt自JDK5产生,JDK7已标记为过期、不推荐使用,JDK8中已彻底删除,自JDK6开始,可以使用Pluggable Annotation Processing API来替换它,apt被替换主要有2点原因:
- api都在com.sun.mirror非标准包下
- 没有集成到javac中,需要额外运行
apt的更多介绍可以参见这里
Pluggable Annotation Processing API
JSR 269,自JDK6加入,作为apt的替代方案,它解决了apt的两个问题,javac在执行的时候会调用实现了该API的程序,这样我们就可以对编译器做一些增强,这时javac执行的过程如下:
做一个AnnotationProcessor
环境
* Mac(gradle)
* IntelliJ IDEA
* Java1.8
* 构建工具Gradle 语言 Groovy
创建项目
模块author-processorx
创建Annotation
1 | package com.hardydou.learn.annotation.processor; |
创建Processor
1 | package com.hardydou.learn.annotation.processor; |
注册Processor服务
模块test
修改build.gradle文件
1 | plugins { |
创建测试类
1 | package com.hardydou.learn.annotation; |
执行测试
由于事件发生在编译时,所以每次要执行clean 才可以看到效果
执行结果