龙目岛如何运作?
Posted
技术标签:
【中文标题】龙目岛如何运作?【英文标题】:How does lombok work? 【发布时间】:2011-08-31 17:18:33 【问题描述】:我今天遇到了lombok。 我很想知道它是如何工作的。A Java Geek Article 提供了一些线索,但我并不十分清楚:
Java 6 移除了 apt 并使 javac 能够 管理注释,简化 获得更简单的过程 单步计算。这是 龙目岛所走的路径。
也许在 Java 6 中编译过程是: javac -> apt -> lombok apt 进程 -> 使用 ASM 读取类文件并添加 set/get 方法?
您能告诉我有关该机制的更多详细信息吗?
【问题讨论】:
查看这篇文章:stackextend.com/java/first-step-lombok-annotations 【参考方案1】:正如 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。【参考方案2】:它使用 Java 6 中可用的JSR 269 Pluggable Annotation Processing API。
请注意,lombok.jar
包含一个名为 /META-INF/services/javax.annotation.processing.Processor
的文件。当javac
在编译类路径中看到此文件时,它会运行在编译期间定义的注释处理器。
【讨论】:
答案不完整。 谢谢!在build.gradle中未将lombok注释处理机制定义为注释处理器时,正在寻找揭开它并在这里找到答案。【参考方案3】:补充 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。【参考方案4】:Project Lombok: Creating Custom Transformations 很有帮助。
【讨论】:
以上是关于龙目岛如何运作?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 maven-compiler-plugin 配置 Lombok?