lombok 是如何工作的?

问题描述 投票:0回答:4

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

Java 6 删除了 apt 并启用了 javac 管理注释,简化 获得更简单的过程 单步计算。这是 龙目岛所走的路。

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

您能向我展示有关该机制的更多详细信息吗?

java annotations lombok
4个回答
175
投票

Lombok 确实针对内部 API 进行编码,正如 Sean Patrick Floyd 所说。然而,由于 lombok ONLY 参与编译阶段,因此声称 Lombok 只能在 sun VM 上运行具有误导性。它只能在 ecj 或 sun 的 javac 上编译。然而,绝大多数虚拟机(如果它们配备了编译器)都是这两者之一。例如,Apple VM 附带了库存 sun javac,因此 lombok 在 Mac 上运行得很好。例如,soylatte VM 也是如此。

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

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

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


114
投票

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

请注意,

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


69
投票

axtavt 答案的附录:Lombok 使用的内容远多于 JSR 269 api 公开的内容。 Lombok 代码针对 a) 内部 javac api 和 b) 内部 eclipse api(在单独的处理器中)。 JSR 269 不允许您修改现有源代码,但是当您将

Element
投射到底层 AST 节点时,您实际上可以修改 AST(这就是 Lombok 项目所做的)。

所以 Lombok 是一个巨大的 hack,只能使用 javac 或 eclipse 的编译器进行编译。这是一个很棒的软件,但也因其非标准的黑客行为而受到许多人的憎恨。


58
投票
© www.soinside.com 2019 - 2024. All rights reserved.