171

我今天遇到了龙目岛
我很想知道它是如何工作的。
Java Geek 文章提供了一些线索,但我并不十分清楚:

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

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

你能告诉我更多关于机制的细节吗?

4

4 回答 4

162

正如 Sean Patrick Floyd 所说,Lombok 确实针对内部 API 编写代码。但是,由于 lombok参与编译阶段,因此声称 Lombok 只能在 sun VM 上运行是一种误导。它只会在 ecj 或 sun 的 javac 上编译。然而,绝大多数虚拟机,如果他们提供编译器的话,就是这两者之一。例如,Apple VM 附带了普通的 sun javac,因此 lombok 在 mac 上运行良好。例如,soylatte VM 也是如此。

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

如果 lombok 所做的事情可以在不使用内部 API 的情况下完成,我们会做其他事情,但它无法完成,所以我们求助于内部 API 使用。

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

于 2011-05-24T23:04:51.487 回答
102

它使用Java 6 中提供的JSR 269 Pluggable Annotation Processing API 。

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

于 2011-05-24T09:36:44.267 回答
63

在 axtavt 的答案的附录中:Lombok 使用的比 JSR 269 api 公开的要多得多。Lombok 代码针对 a) 内部 javac api 和 b) 内部 eclipse api(在单独的处理器中)。JSR 269 不允许您修改现有源代码,但是当您将 anElement转换为底层 AST 节点时,您实际上可以修改 AST(Lombok 项目就是这样做的)。

所以 Lombok 是一个巨大的 hack,只能使用 javac 或 eclipse 的编译器进行编译。这是一款很棒的软件,但它也被许多人讨厌,因为它是一种非标准的黑客。

于 2011-05-24T09:47:32.850 回答
54

Project Lombok:创建自定义转换很有帮助。

于 2011-05-25T00:30:44.667 回答