技术成就梦想

Lombok 简单说明 转 Lombok 简单说明 glen_xu



Lombok 注解在线帮助文档:http://projectlombok.org/features/index.

常用的 Lombok 注解

注解 说明
@Data 注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
@Value 用在类上,是@Data的不可变形式,相当于为属性添加final声明,只提供getter方法,而不提供setter方法
@Setter 注解在类上和属性上;为属性提供 setting 方法
@Getter 注解在类上和属性上;为属性提供 getting 方法
@NoArgsConstructor 注解在类上;为类提供一个无参的构造方法
@AllArgsConstructor 注解在类上;为类提供一个全参的构造方法
@ToString 生成 toString 方法
@Builder 用在类、构造器、方法上,为你提供复杂的builder APIs
@SneakyThrows 自动抛受检异常,而无需显式在方法上使用throws语句

日志注解

@Log:根据不同的注解生成不同类型的log对象,但是实例名称都是log,有六种可选实现类。

注解 说明
@CommonsLog log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
@Log log = java.util.logging.Logger.getLogger(LogExample.class.getName());
@Log4j log = org.apache.log4j.Logger.getLogger(LogExample.class);
@Log4j2 log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
@Slf4j log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
@XSlf4j log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);

Lombok原理

  了解了简单的使用之后,现在应该比较好奇它是如何实现的。整个使用的过程中,只需要使用注解而已,不需要做其它额外的工作,那玄妙之处应该是在注解的解析上。 
   
JDK5引入了注解的同时,也提供了两种解析方式。

运行时解析

  运行时能够解析的注解,必须将 @Retention 设置为 RUNTIME ,这样可以通过反射拿到该注解。 
  

编译时解析(Lombok使用)

编译时解析有两种机制:

1.Annotation Processing Tool

  apt自JDK5产生,JDK7已标记为过期,不推荐使用,JDK8中已彻底删除,自JDK6开始,可以使用Pluggable Annotation Processing API来替换它,apt被替换主要有2点原因:

  • api都在com.sun.mirror非标准包下
  • 没有集成到javac中,需要额外运行

2.Pluggable Annotation Processing API

  JSR 269,自JDK6加入,作为apt的替代方案,它解决了apt的两个问题,javac在执行的时候会调用实现了该API的程序,这样我们就可以对编译器做一些增强,这时javac执行的过程如下:

这里写图片描述

  Lombok就是使用这种方式实现的,有兴趣的话可以去看看其Lombok源码,对应注解的实现都在HandleXXX中,比如@Getter注解的实现是HandleGetter.handle()。还有一些其它类库使用这种方式实现,比如Google Auto、Dagger等等。 
  

Lombok问题

  1. 无法支持多种参数构造器的重载。
  2. 会降低代码可读性。