1

最近对“龙目岛”产生了浓厚的兴趣。我想通过阅读源代码来了解更多。

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

有人可以给点建议吗?喜欢先阅读哪个包/类,还是逻辑流程?

谢谢。

4

1 回答 1

4

我目前正在写一篇关于龙目岛的学士论文,所以我会尝试解释一些东西。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 方法)。

hacky部分在哪里?好吧,如果您查看代码,您会看到一些可疑的转换,例如:

(JCCompilationUnit) path.getCompilationUnit();

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关于添加您自己的转换的文章

玩得开心!

于 2014-04-14T09:52:18.523 回答