我今天遇到了lombok
我非常想知道它是如何工作的。
A Java Geek Article提供了一些线索,但对我来说并不是很清楚:
Java 6删除apt并使javac能够 管理注释,精简 获得更简单的过程 单步计算。这是 龙目岛采取的路径。
也许使用Java 6编译过程将是: javac - > apt - > lombok apt process - >读取类文件并使用ASM添加set / get方法?
你能告诉我关于这种机制的更多细节吗?
答案 0 :(得分:114)
正如肖恩·帕特里克·弗洛伊德所说,龙目岛确实对内部API进行了编码。但是,由于lombok在编译阶段只涉及 ONLY ,因此声称Lombok的误导性只能在sun VM上运行。它只能在ecj或sun的javac上编译。然而,绝大多数虚拟机,如果它们根本就运送编译器,则是其中之一。例如,Apple VM附带了sun sun javac,因此lombok在mac上运行得很好。例如,对于soylatte VM也是如此。
虽然对于javac我们确实必须坚持他们的更新,部分是因为他们的编译器现在正在进行大量的工作,我们不得不对许多版本的eclipse中的eclipse支持进行一次微调。 。因此,虽然我们对内部API进行编码,但它们是相对稳定的位。
如果lombok可以在不使用内部API的情况下完成,我们已经做了其他事情,但是无法完成,所以我们采用内部API使用。
NB:我是lombok的主要开发者之一,所以,我可能有点偏颇:P答案 1 :(得分:62)
它使用Java 6中提供的JSR 269 Pluggable Annotation Processing API。
请注意,lombok.jar
包含名为/META-INF/services/javax.annotation.processing.Processor
的文件。当javac
在编译类路径中看到此文件时,它会在编译期间运行那里定义的注释处理器。
答案 2 :(得分:41)
答案 3 :(得分:37)
对于axtavt的答案的补充:龙目岛使用的内容比JSR 269 api暴露的要多得多。 Lombok代码针对a)内部javac apis和b)内部eclipse apis(在单独的处理器中)。 JSR 269不允许您修改现有的源代码,但是当您将Element
强制转换为基础AST节点时,您实际上可以修改AST(这是Lombok所做的项目)。
所以Lombok是一个巨大的黑客攻击,只能在Sun VM上运行编译(afaik)。它是一款非常棒的软件,但是很多人都因为这种非标准的黑客而感到讨厌。