Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。
具体使用
原理
了解了简单的使用之后,现在应该比较好奇它是如何实现的。整个使用的过程中,只需要使用注解而已,不需要做其它额外的工作,那玄妙之处应该是在注解的解析上。 JDK5引入了注解的同时,也提供了两种解析方式。
-
运行时解析,运行时能够解析的注解,必须将@Retention设置为RUNTIME,这样可以通过反射拿到该注解。 java.lang.reflect反射包中提供了一个接口AnnotatedElement,该接口定义了获取注解信息的几个方法,Class、Constructor、Field、Method、Package等都实现了该接口,大部分开发者应该都很熟悉这种解析方式。
-
编译时解析有两种机制,网上很多文章都把它俩搞混了,分别简单描述一下。
-
Annotation Processing Tool,apt自JDK5产生,JDK7已标记为过期,不推荐使用,JDK8中已彻底删除,自JDK6开始,可使用下面的方式
-
Pluggable Annotation Processing API JSR 269,自JDK6加入,作为apt的替代方案,它解决了apt的两个问题,javac在执行的时候会调用实现了该API的程序,这样我们就可以对编译器做一些增强. Lombok就是使用这种方式实现的,有兴趣的话可以去看看其Lombok源码,对应注解的实现都在HandleXXX中,比如@Getter注解的实现是HandleGetter.handle()。 还有一些其它类库使用这种方式实现,比如Google Auto、Dagger等等。
问题
- 无法支持多种参数构造器的重载
- 奇淫巧技,使用会有争议
其实当你用起来,你会发现这些都不是问题