Java 为什么我必须添加Lombok插件,为什么添加依赖项是不够的

Java 为什么我必须添加Lombok插件,为什么添加依赖项是不够的,java,plugins,dependencies,lombok,Java,Plugins,Dependencies,Lombok,我很好奇为什么我要添加Lombok插件。为什么向pom.xml添加依赖项是不够的,比如在Mockito中?您必须了解Lombok实际上是如何工作的 这里有两个部分: 注释,例如@Data、@ToString、 实际上生成相应代码的“插件” 您需要lombok的依赖项,以便编译器/IDE能够自行解析注释。(注释需要导入,就像您在源代码中使用的任何其他“元素”一样)。但这只能确保编译器/IDE知道这些是有效的注释 真正的诀窍是,稍后,当代码编译成类文件时,lombok的“活动”部分可用于实际生成

我很好奇为什么我要添加
Lombok
插件。为什么向
pom.xml
添加依赖项是不够的,比如在
Mockito
中?

您必须了解Lombok实际上是如何工作的

这里有两个部分:

  • 注释,例如@Data、@ToString、
  • 实际上生成相应代码的“插件”
您需要lombok的依赖项,以便编译器/IDE能够自行解析注释。(注释需要导入,就像您在源代码中使用的任何其他“元素”一样)。但这只能确保编译器/IDE知道这些是有效的注释

真正的诀窍是,稍后,当代码编译成类文件时,lombok的“活动”部分可用于实际生成代码

这类似于。您需要在编译时导入一个JAR,以便所有不同的验证注释都是已知的,并且可以在源代码中使用。但是为了使对象能够被主动验证,您以后需要一些其他组件来进行验证(这里的区别是验证发生在运行时,而Lombok只是编译时的事情)

请注意:第二种“注释使用/处理”方式是更常见的路径。在您关于JUnit和@RunWith的示例中:该注释告诉JUnit在运行时使用该mockito runner类(而不是它自己的runner实现)。然后,mockito运行程序知道在运行时如何处理所有其他注释。同样的情况:源代码中的注释需要知道,对于活动部分,某些组件在运行时正在做一些事情

当然,您也可以使用注释来影响构建任务,但是如上所述,这不太常见,而且更复杂。

Lombok是一个所谓的注释处理器,Mockito“只是”一个常规Java库。注释处理器

  • 定义可以在Java代码中使用的注释,以及
  • 当使用这些注释编译源代码时,它们会连接到编译过程中,并更改输入源代码或生成新代码
JDK附带的Java编译器javac自动检测类路径上的注释处理器并调用它们,以便它们能够处理注释并生成代码。因此,当您将Lombok添加到pom.xml并调用
mvn包(调用javac)时,一切都很好:Lombok现在位于类路径上,由javac调用,您可以在代码中使用Lombok的注释

javac的主要目的是将有效的Java代码编译成字节码。但是,在编写Java代码时,大多数情况下代码都是无效的。因此,Eclipse或IntelliJ IDEA等高级IDE将重点放在帮助开发人员,即使他们的代码无法编译。如果他们仅仅使用javac作为他们分析和编译Java代码的唯一手段,那么他们对开发人员帮助不大。代码大纲、依赖性分析、查找方法调用目标等功能也必须尽可能好地处理无效代码


为了实现这一点,Eclipse和IntelliJ IDEA都有自己的Java编译器。例如,Eclipse的编译器使用完全不同的代码抽象语法树(AST)表示形式。而它主要是龙目龙目公司运营的AST。因此,Lombok对每个注释都有两个注释处理程序:一个用于javac,一个用于Eclipse。这就是Lombok需要安装在Eclipse中的原因:为了能够连接到Eclipse的内部编译器。

@GhostCat没有示例代码。我如何添加示例代码?从技术上讲,这是一个问题。@GhostCat他的意思是,只有当您同时安装了依赖项和插件时,lombok才会生成代码。@pipilam我可能错了,但如果我理解正确:依赖项只为您提供足够的访问注释等的权限,它的插件将实际生成代码。我怀疑在不涉及插件的情况下生成代码是可能的。这就是我的意思。但是我想知道关于Mockito的事。例如,我们有
@RunWith(MockitoJUnitRunner.class)
。通过使用is,我们不必在方法之前编写@Before代码。因此,对于我来说,
@RunWith(MockitoJUnitRunner.class)
正如您所说,
生成相应的代码。对于Mockito,我们不需要任何插件。为什么?一点也不@RunWith是一个JUnit注释。JUnit框架执行您的代码,使用RunWith,您告诉它使用特定的Runner类。然后,底层框架在特定时间点再次调用该runner类。我会在我的答案中添加一些更新。