ChatGPT解决这个技术问题 Extra ChatGPT

龙目岛如何运作?

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

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

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

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


r
rzwitserloot

正如 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


很高兴听到消息来源(+1)。我承认,我关于跑步的说法具有误导性。我的意思是 Lombok 只能在 Sun VM 上运行,但生成的代码当然是平台中立的。
我有点想知道注释处理器是否可以将所有内容委托给 eclipse 编译器,即使它是通过 JavaC 运行的,那样只有一个处理器可以调用。
@rzwitserloot:这就是我非常喜欢 SO 的原因。核心开发人员本人的真实答案。
Lombok 是否仍在使用内部 API,或者这种情况自 2011 年以来是否有所改变? This comment 声称 Lombok 现在使用官方 API。
a
axtavt

它使用 Java 6 中可用的 JSR 269 Pluggable Annotation Processing API

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


答案是不完整的。
谢谢!当它在 build.gradle 中未定义为注释处理器时,正在寻找揭示 lombok 注释处理机制并在此处找到答案。
M
Michael

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

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


@SeanPatrickFloyd 附录:使用 OpenJDK 11 编译 Lombok 注释我还没有遇到任何问题。
@orithena 是的,那应该可以。除非您引入第二个注释处理器,并且突然遇到竞争条件,因为 Lombok 正在更改另一个处理器期望找到的 AST。
W
Walery Strauch