龙目岛如何运作?

我今天见了龙目岛 。
我很想知道它是如何工作的。
一篇Java Geek文章给出了一些线索,但对我来说并不完全清楚:

Java 6删除apt并使javac能够pipe理注释,简化了stream程以获得更简单的单步计算。 这是龙目岛所采取的道路。

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

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

正如肖恩·帕特里克·弗洛伊德(Sean Patrick Floyd)所说,龙目岛确实是针对内部API编码的 不过,由于龙目岛参与编译阶段,所以它要求龙目岛的误导只会在太阳虚拟机上运行。 它只会在ecj或sun的javac上编译。 然而,绝大多数虚拟机(如果他们运行编译器的话)都是其中之一。 例如,Apple VM附带stock sun javac,因此lombok在Mac上运行良好。 例如,soylatte VM也是如此。

对于javac,我们确实需要坚持更新,部分原因是现在编译器正在进行大量的工作,所以我们不得不在Eclipse的许多版本的eclipse上做一个小小的调整。 所以,当我们对内部API进行编码时,它们是相对稳定的。

如果lombok所做的事情可以不借助内部API来完成的话,我们可以做其他的事情,但是不能做到,所以我们采取内部API的使用方式。

注意:我是龙目岛的主要开发者之一,所以,我可能有些偏见:P

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

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

项目龙目岛:创build自定义转换是一些有用的。

在axtavt答案的附录中:龙比特使用了比JSR 269 api更多的东西。 龙目岛代码针对a)内部javac apis和b)内部eclipse apis(在一个单独的处理器中)。 JSR 269不允许您修改现有的源代码,但是当您将Element转换为底层的AST节点时,您实际上可以修改AST(这是Lombok所做的项目)。

所以龙目是一个只能在Sun VM(afaik)上运行编译的巨大黑客。 这是一个伟大的软件,但也被许多人恨为非标准的黑客。