如何阅读lombok的来源?

时间:2014-01-02 03:57:03

标签: lombok

最近,我对“lombok”很感兴趣。 我想通过阅读源代码了解更多信息。

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

有人可以提供一些建议吗? 比如先读取哪个包/类,或逻辑流?

感谢。

1 个答案:

答案 0 :(得分:4)

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

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

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

我将简要介绍Oracle编译器部分。这是在使用lombok注释编译项目期间发生的事情。

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

    (JCCompilationUnit) path.getCompilationUnit();
    

    Lombok希望接收某些接口实现,并使用这些内部实现来完成它的工作。

    进一步阅读:

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

    玩得开心!