Java 龙目山是如何运作的?

Java 龙目山是如何运作的?,java,annotations,lombok,Java,Annotations,Lombok,我今天见过面。 我非常想知道它是如何工作的。 提供了一些线索,但我并不十分清楚: Java6删除了apt并使javac能够 要管理批注,请简化 获得更简单的方法的过程 单步计算。这是 龙目所走的道路 使用Java 6,编译过程可能是: javac->apt->lombok apt process->读取类文件并使用添加set/get方法 您能向我展示更多关于该机制的详细信息吗?它使用Java 6中提供的机制 请注意,lombok.jar包含一个名为/META-INF/services/javax

我今天见过面。
我非常想知道它是如何工作的。
提供了一些线索,但我并不十分清楚:

Java6删除了apt并使javac能够 要管理批注,请简化 获得更简单的方法的过程 单步计算。这是 龙目所走的道路

使用Java 6,编译过程可能是: javac->apt->lombok apt process->读取类文件并使用添加set/get方法

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

它使用Java 6中提供的机制


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

在axtavt答案的附录中:Lombok使用的比JSR269API公开的多得多。Lombok代码针对a)内部JavaCAPI和b)内部EclipseAPI(在单独的处理器中)。JSR269不允许您修改现有的源代码,但是当您向底层AST节点强制转换时,您实际上可以修改AST(这就是Lombok项目所做的)


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

正如肖恩·帕特里克·弗洛伊德所说,Lombok确实是针对内部API编写代码的。然而,由于lombok只涉及编译阶段,因此声称lombok将只在sun VM上运行会产生误导。它只能在ecj或sun的javac上编译。然而,绝大多数虚拟机(如果它们提供编译器的话)都是这两种虚拟机中的一种。例如,苹果的虚拟机附带了sunjavac,因此lombok可以在macs上正常工作。例如,大豆拿铁VM也是如此

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

如果lombok所做的事情可以在不使用内部API的情况下完成,那么我们本来可以做一些其他的事情,但它无法完成,所以我们使用内部API


注意:我是lombok的主要开发人员之一,因此,我可能有点偏见:p有些帮助。

很高兴听到消息来源(+1)。我承认,我关于跑步的说法有误导性。我的意思是Lombok只能在Sun VM上运行,但生成的代码当然是平台无关的。我有点想知道注释处理器是否可以将所有内容委托给eclipse编译器,即使它是通过JavaC运行的,也只有一个处理器可以调用。@rzwitserroot:这就是为什么我非常喜欢这样。来自核心开发人员本人的真实答案。Lombok是否仍在使用内部API,或者自2011年以来这种情况发生了变化?声称Lombok最近使用官方API。请查看这篇文章:@SeanPatrickFloyd addendment:我还没有用OpenJDK 11编译Lombok注释的问题。@orithena是的,应该可以。除非引入第二个注释处理器,并且由于Lombok正在更改另一个处理器期望找到的AST而突然陷入竞争状态。