简介
Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,
通过使用对应的注解,可以在编译源码的时候生成对应的方法。
官方地址:https://projectlombok.org/,
github地址:https://github.com/rzwitserloot/lombok。
出现背景
java5 注解
java6 编译器支持
实现原理
JSRs: Java Specification Requests
JSR 269: Pluggable Annotation Processing API
https://www.jcp.org/en/jsr/detail?id=269
详解:http://baijiahao.baidu.com/s?id=1590955453588363109&wfr=spider&for=pc
了解了简单的使用之后,现在应该比较好奇它是如何实现的。整个使用的过程中,只需要使用注解而已,不需要做其它额外的工作,那玄妙之处应该是在注解的解析上。JDK5引入了注解的同时,也提供了两种解析方式。
运行时解析
运行时能够解析的注解,必须将@Retention设置为RUNTIME,这样可以通过反射拿到该注解。java.lang.reflect反射包中提供了一个接口AnnotatedElement,该接口定义了获取注解信息的几个方法,Class、Constructor、Field、Method、Package等都实现了该接口,大部分开发者应该都很熟悉这种解析方式。
编译时解析
编译时解析有两种机制,网上很多文章都把它俩搞混了,分别简单描述一下。
Annotation Processing Tool
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执行的过程如下:
Lombok就是使用这种方式实现的,有兴趣的话可以去看看其Lombok源码,对应注解的实现都在HandleXXX中,比如@Getter注解的实现是HandleGetter.handle()。还有一些其它类库使用这种方式实现,比如Google Auto、Dagger等等。
常用注解
详细查看:https://blog.csdn.net/ghsau/article/details/52334762
- Data
- AllArgsConstructor
- NoArgsConstructor
- Getter
- Setter
- Slf4j
- EqualsAndHashCode
- Cleanup
- Builder
- ToString
- val
- SneakyThrows
- Synchronized
弊端
- eclipse 需要单独配置
- idea/eclipse 配置不同
- idea 需要开启 annotation process
- 调试起来麻烦
参考资料
official: https://github.com/rzwitserloot/lombok
jcp: https://www.jcp.org/en/jsr/detail?id=269
blogs:https://blog.csdn.net/dslztx/article/details/46715803
https://docs.oracle.com/javase/7/docs/technotes/guides/apt/GettingStarted.html