lombok是如何工作的?

uui*_*ode 134 java annotations lombok

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

Java 6删除了apt并使javac能够管理注释,简化流程以获得更简单的单步计算.这是龙目岛采取的路径.

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

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

rzw*_*oot 124

正如肖恩·帕特里克·弗洛伊德所说,龙目岛确实对内部API进行了编码.但是,由于lombok 参与编译阶段,因此它对使用Lombok的误导只会在sun VM上运行.它只能在ecj或sun的javac上编译.然而,绝大多数虚拟机,如果它们根本就运送编译器,则是其中之一.例如,Apple VM附带了sun sun javac,因此lombok在mac上运行得很好.例如,对于大豆饼干VM也是如此.

虽然对于javac我们确实必须坚持他们的更新,部分是因为他们的编译器现在正在进行大量的工作,我们不得不对许多版本的eclipse中的eclipse支持进行一次微调.因此,虽然我们针对内部API进行编码,但它们是相对稳定的位.

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

NB:我是lombok的主要开发者之一,所以,我可能有点偏颇:P

  • 很高兴听到消息来源(+1).我承认,我关于跑步的说法有误导性.我的意思是Lombok只能在Sun VM上运行,但结果代码当然是平台中立的. (5认同)

axt*_*avt 68

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

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

  • 答案是不完整的。 (2认同)
  • 谢谢!当 lombok 注释处理机制未在 build.gradle 中定义为注释处理器时,正在寻找 lombok 注释处理机制的揭晓,并在这里找到了答案。 (2认同)

Sea*_*oyd 46

在对axtavt的答案的补充中:龙目岛使用的内容比JSR 269 api暴露的要多得多.Lombok代码针对a)内部javac apis和b)内部eclipse apis(在单独的处理器中).JSR 269不允许您修改现有的源代码,但是当您Element转换为基础AST节点时,您实际上可以修改AST(这是Lombok所做的项目).

所以Lombok是一个巨大的黑客攻击,只能在Sun VM上运行编译(afaik).这是一个很棒的软件,但是很多人也因为这样的非标准黑客而讨厌它.

  • @orithena 是的,那应该可行。除非您引入第二个注释处理器,并且突然遇到竞争条件,因为 Lombok 正在更改另一个处理器期望找到的 AST。 (3认同)