Lombok简介

简介

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 AutoDagger等等。

常用注解

详细查看: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值