首页 > 代码库 > Lombok浅析(一)

Lombok浅析(一)

之前都在用lombok,但一直不知道是怎么实现的,作为有理想的程序猿,觉得不能不知其所以然,所以就有了此文。

简单来讲,lombok就是在编译时对抽象语法树(AST)进行了修改来实现它的功能。要了解lombok是怎么做的,那我们需要先了解下Java语言的编译器是怎么工作的。

javac

Java的编译过程可以分成三个阶段:

技术分享

  1. 所有源文件会被解析成语法树。
  2. 调用注解处理器。如果注解处理器产生了新的源文件,新文件也要进行编译。
  3. 最后,语法树会被分析并转化成类文件。

过程实现在JavaCompiler。我们这里只了解个大概先。

AnnotationProcessor

JSR-269提供了一种插件式的注解处理机制,通过ServiceLoader机制可以给Java编译器插上我们自己的注解处理器。也就是说,在上述编译过程的第二阶段,是允许用户介入的。

正是通过这个机制,lombok迈出了第一步。来看下lombok的jar包,

技术分享

javax.annotation.processing.Processor是个配置点,lombok的实现也就是该文件的内容如下:

lombok.core.AnnotationProcessor

也就意味着,在编译的第二阶段会执行lombok.core.AnnotationProcessor。它所做的工作就是我们上面所说的,修改AST。

hack

但是在JSR-269的规范里面,并没有提供修改AST的API,那么lombok是怎么达到它的目的的?It‘s a total hack. Using non-public API.这是lombok的作者所说的。也就是说lombok是使用了一些内部的API,也许是通过强制类型转换也许是其他,这个后续再探讨,现在只需要明白一点,lombok有风险,使用需谨慎^_^ 如果某天发布的新版本JDK修改了那些内部API,那么我们使用了lombok的代码在那个版本的JDK上面将无法编译通过,我们就要寄希望于lombok的工程师们对lombok进行修复升级了,万一修复不了呢?总之,是个坑哈。

参考资料

  • http://notatube.blogspot.com/2010/11/project-lombok-trick-explained.html
  • http://openjdk.java.net/groups/compiler/doc/compilation-overview/index.html

Lombok浅析(一)