lombok是如何工作的?

191

今天我遇见了lombok
我非常想知道它是如何工作的。
Java极客文章提供了一些线索,但对我来说并不完全清晰:

Java 6移除了apt并使javac能够管理注解,简化了获得更简单的单步计算的过程。这是Lombok所采取的路径。

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

你能向我展示更多关于机制的细节吗?


1
请查看此文章:https://www.stackextend.com/java/first-step-lombok-annotations/ - Mouad EL Fakir
4个回答

178

Lombok确实使用了内部API,就像Sean Patrick Floyd所说的那样。但是,由于lombok仅涉及编译阶段,因此声称Lombok仅能在sun VM上运行是误导性的。它只能在ecj或sun的javac上进行编译。但是,大多数VM中都包含编译器,如果存在编译器,则为这两个之一。例如,Apple VM使用标准sun javac,因此lombok在Mac上可以正常工作。例如,Soylatte VM也是如此。

对于javac,我们确实必须坚持使用它们的更新,部分原因是因为他们正在进行大量的编译器工作,而我们在许多版本的eclipse中只需要进行1次微小的调整。因此,虽然我们确实使用了内部API,但它们是相对稳定的部分。

如果不使用内部API也能完成Lombok的功能,我们会选择其他方案,但是现实情况是我们必须使用内部API。

注:我是lombok的首席开发人员之一,因此可能会有一些偏见: P


13
很高兴从权威渠道听到这个消息 (+1)。我承认,我关于运行的陈述是有误导性的。我的意思是 Lombok 只能在 Sun VM 上运行,但生成的代码当然是平台无关的。 - Sean Patrick Floyd
我有点想知道注释处理器是否可以将所有内容委托给Eclipse编译器,即使它是通过JavaC运行的,这样就只需要调用一个处理器。 - Archimedes Trajano
@rzwitserloot:这就是为什么我非常喜欢SO。来自核心开发人员的真实答案。 - Gaurav
Lombok现在是否仍在使用内部API,或者自2011年以来情况是否有所改变?这条评论声称Lombok现在使用官方API。 - phant0m

115

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

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


2
答案不完整。 - Commander Tvis
2
谢谢!我一直在寻找Lombok注解处理机制的揭示,尤其是当它没有在build.gradle中定义为注解处理器时,我在这里找到了答案。 - ASten

69
在补充axtavt的回答时:Lombok使用的不仅仅是JSR 269 API所提供的功能。 Lombok使用了a)内部javac API和b)内部eclipse API(在单独的处理器中)。 JSR 269不能让您修改现有的源代码,但是当您将一个Element强制转换为底层AST节点时,您实际上可以修改AST(这就是Lombok项目所做的)。

因此,Lombok是一个巨大的黑科技,只能使用javac或eclipse编译器进行编译。它是一款很棒的软件,但由于其非标准的黑科技而遭到许多人的厌恶。


@SeanPatrickFloyd 补充说明:我使用 OpenJDK 11 编译 Lombok 注解还没有遇到任何问题。 - orithena
2
@orithena 是的,那应该可以。除非你引入了第二个注解处理器,然后突然遇到竞争条件,因为 Lombok 正在改变 AST,而其他处理器期望找到它。 - Sean Patrick Floyd
谢谢。我一直在寻找这个解释。我已经编写了JSR 269处理器来添加新的类,但从未修改过现有的类。我不知道Lombok是如何做到的。现在我知道不应该尝试借鉴他们的方法。 - user1575326


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接