龙目岛如何运作?


148

我今天遇见了龙目岛
我很想知道它是如何工作的。
Java极客文章提供了一些线索,但对我来说还不是很清楚:

Java 6删除了apt,并使javac能够管理注释,从而简化了流程以获得更简单的单步计算。这是龙目岛采取的道路。

也许在Java 6中,编译过程将是:javac-> apt-> lombok apt进程->读取类文件并使用ASM添加set / get方法?

您能告诉我有关该机制的更多细节吗?


Answers:


135

正如Sean Patrick Floyd所说,Lombok确实针对内部API进行编码。但是,由于lombok 参与编译阶段,因此误导性声称Lombok将仅在sun VM上运行。它只能在ecj或sun的javac上编译。但是,如果有的话,绝大多数VM根本不提供编译器,而是两者之一。例如,Apple VM附带有库存的sun javac,因此lombok在Mac上运行良好。例如,soylatte VM也是如此。

尽管对于Javac,我们确实必须坚持他们的更新,部分原因是由于目前他们的编译器正在进行大量工作,但在许多版本的eclipse上,我们只需要对eclipse支持进行1次小的调整。因此,尽管我们针对内部API进行编码,但它们是相对稳定的位。

如果lombok所做的事情可以在不依靠内部API的情况下完成,那么我们本来可以做其他事情,但是不能做到,所以我们可以利用内部API。

注意:我是lombok的主要开发人员之一,所以,我可能有点偏见:P


7
很高兴收到消息来源(+1)。我承认,我关于跑步的说法具有误导性。我的意思是Lombok只能在Sun VM上运行,但是生成的代码当然是平台无关的。
肖恩·帕特里克·弗洛伊德

我有点想知道注释处理器是否可以将所有内容委派给eclipse编译器,即使它是通过JavaC运行的,也就是只有一个处理器可以调用。
阿基米德·特拉哈诺

@rzwitserloot:这就是为什么我非常喜欢SO。来自核心开发人员本人的真实答案。
gaurav '19

78

它使用Java 6中提供的JSR 269可插拔注释处理API

请注意,lombok.jar其中包含一个名为的文件/META-INF/services/javax.annotation.processing.Processor。当javac在编译类路径中看到此文件时,它将运行在编译过程中在那里定义的注释处理器。


好答案@axtavt!
gaurav

54

除了axtavt的答案:Lombok使用的内容比JSR 269 API公开的内容更多。Lombok针对a)内部Javac API和b)内部Eclipse API(在单独的处理器中)进行编码。JSR 269不允许您修改现有的源代码,但是当您将其Element转换为基础AST节点时,您实际上可以修改AST(Lombok项目就是这样做的)。

所以,龙目岛是一个巨大的黑客工具,将只运行在Sun VM(据我所知)编译。这是一个很棒的软件,但也被许多非标准的黑客所讨厌。


1
这仍然是有效信息吗?
OndraŽižka18年

1
对。的确如此。
肖恩·帕特里克·弗洛伊德

@SeanPatrickFloyd附录:我还没有使用OpenJDK 11编译Lombok注释的问题
。– orithena

1
@orithena是的,应该可以。除非您引入第二个注释处理器,否则由于Lombok更改了另一个处理器希望找到的AST而突然陷入竞争状态。
肖恩·帕特里克·弗洛伊德

2
我将尝试回答我自己的问题,如果有机会,请进行验证:“由于Groovy / Kotlin附带了自己成熟的编译器,该编译器将负责生成字节码。无需破解另一个编译器(Java编译器)的字节码生成过程。”
所谓的随机花花公子

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.