如何阅读lombok的源码?

Slo*_*oth 2 lombok

最近,我对“lombok”产生了极大的兴趣。我想通过阅读源代码来更多地了解它。

但尝试之后,我发现这对我来说真的很难。我只发现有“javac”和“ECJ”两个实现。但不明白它是如何端到端工作的。

有人可以给一些建议吗?比如首先阅读哪个包/类,或者逻辑流程?

谢谢。

Cof*_*fei 5

我目前正在写一篇关于龙目岛的学士论文,所以我会尝试解释一些东西。Lombok 使用 Java 注释处理 [1],它基本上在使用某些注释的节点(例如类、方法)上运行一些预定义的任务。但是,您无法使用此方法修改现有源,这就是 Lombok 使用内部 API 的原因,这些 API 不受支持且可以进行更改。这就是为什么 Lombok 被很多人讨厌,因为它基本上是一个 hack。

要从 Lombok 源开始,有两个主要的包:

  • lombok.javac是 Oracle Java 编译器的实现
  • lombok.eclipse Eclipse 编译器的实现在哪里

我简单介绍一下Oracle编译器部分。这是使用 lombok 注释编译项目期间发生的情况。

  1. lombok.javac.apt。调用Processor#process(...)并将编译单元(将它们视为类)移交给此类进行处理。
  2. 处理器将它们交给JavacTransformer类,在其中将其转换为 AST。
  3. 然后用JavacTransformer遍历这个AST。AnnotationVisitor搜索代码中的所有注释。这是一个重要的部分,因为访问者可以找到所有注释,Java注释处理无法检测到所有注释(例如,它忽略方法内的注释)。
  4. 找到的每个注释都由HandlerLibrary处理,它加载了所有转换(如 @Getter),并且知道应该为哪个注释触发哪个转换。
  5. 触发转换,即实现JavacAnnotationHandler 的类。您可以在lombok.javac.handlers包中找到转换。转换验证注释是否正确使用并完成其工作(例如@Getter 生成一个getter 方法)。

黑客的部分在哪里?好吧,如果你查看代码,你会看到一些可疑的强制转换,例如:

(JCCompilationUnit) path.getCompilationUnit();
Run Code Online (Sandbox Code Playgroud)

Lombok 期望接收接口的某些实现,并使用这些内部实现来完成它的任务。

进一步阅读:

[1] http://deors.wordpress.com/2011/10/08/annotation-processors/是很好的教程
[2] lombok 是如何工作的?Lombok 首席开发人员解释了为什么 lombok 使用内部 API
[3] http://notatube.blogspot.cz/2010/12/project-lombok-creating-custom.html关于添加您自己的转换的文章

玩得开心!