Answers:
正如Sean Patrick Floyd所说,Lombok确实针对内部API进行编码。但是,由于lombok 仅参与编译阶段,因此误导性声称Lombok将仅在sun VM上运行。它只能在ecj或sun的javac上编译。但是,如果有的话,绝大多数VM根本不提供编译器,而是两者之一。例如,Apple VM附带有库存的sun javac,因此lombok在Mac上运行良好。例如,soylatte VM也是如此。
尽管对于Javac,我们确实必须坚持他们的更新,部分原因是由于目前他们的编译器正在进行大量工作,但在许多版本的eclipse上,我们只需要对eclipse支持进行1次小的调整。因此,尽管我们针对内部API进行编码,但它们是相对稳定的位。
如果lombok所做的事情可以在不依靠内部API的情况下完成,那么我们本来可以做其他事情,但是不能做到,所以我们可以利用内部API。
注意:我是lombok的主要开发人员之一,所以,我可能有点偏见:P
它使用Java 6中提供的JSR 269可插拔注释处理API。
请注意,lombok.jar
其中包含一个名为的文件/META-INF/services/javax.annotation.processing.Processor
。当javac
在编译类路径中看到此文件时,它将运行在编译过程中在那里定义的注释处理器。
除了axtavt的答案:Lombok使用的内容比JSR 269 API公开的内容更多。Lombok针对a)内部Javac API和b)内部Eclipse API(在单独的处理器中)进行编码。JSR 269不允许您修改现有的源代码,但是当您将其Element
转换为基础AST节点时,您实际上可以修改AST(Lombok项目就是这样做的)。
所以,龙目岛是一个巨大的黑客工具,将只运行在Sun VM(据我所知)编译。这是一个很棒的软件,但也被许多非标准的黑客所讨厌。
龙目岛项目:创建自定义转换会有所帮助。