如何抑制警告 'cannot resolve method' 因为您使用注释生成方法?

How to suppress warning 'cannot resolve method' because you generate the method using annotation?

我的目标是学习如何创建注释。所以,我使用项目lombok的@Getter注解来练习。但是,让我困扰的一件事是 IntelliJ IDEA 会发出 Cannot resolve method 'getId' in 'Product' 的警告。请注意,编译不是问题。

我做了什么:

  1. 在设置中启用注释处理。

我的预期结果:IDE 知道 getId 方法将在编译时注入。

我的实际结果:IDE 引发警告。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
  public static Logger logger = LoggerFactory.getLogger(Main.class);
  public static void main(String[] args) {
    Product product = new Product();
    logger.debug(Integer.toString(product.getId()));
  }
}
import lombok.Getter;

public class Product {
  @Getter
  private int id = 10;
}

PS: 听说需要安装Lombok插件。有没有不用插件的方法?我需要它在我自己的注释中实现它。

Lombok 不是注解处理器。 Lombok 是一个独特的软件,并且(作为核心作者之一),lombok 所做的一点也不简单:如果你想做类似 lombok 的事情,你必须分叉 lombok 代码库。

从这个意义上说,以 lombok 为例说明注解可以做什么并不是一个好主意:Lombok 是它自己的东西,仅仅使用注解来知道在哪里行动,不是 一个处理器(但是,奇怪的是,它把自己注册为一个处理器,以便成为编译过程的一部分)。

直接回答您的问题:

  1. 是的,你需要安装lombok插件;如果没记错的话,最新版本的 intellij 会默认安装它。

  2. 不,没有它就不能使 lombok 工作。

  3. 但是,实际的普通注释处理器可以正常工作。

  4. 基本(非 lombok)注释处理器只能创建新文件 - 它们不能更改现有文件。只有 lombok 可以做到这一点(并且它需要一个插件)。如果您编写一个基本的注释处理器(因此只能创建新文件),您所做的(打开'annotation processing')就是所需要的。

请注意,基本的注解处理器往往需要经过完整的构建,并且在增量编译方面存在问题(例如,如果注解处理器被加载,增量编译工具通常每次都会编译所有内容。大多数工具都知道 lombok不是注解处理器/在增量编译场景中工作得很好并且知道不会回退到 'compile all the things all the time')。对于大中型项目,'compile everything' 是您希望避免的巨大时间浪费。

您的后续步骤:

  • 考虑是否可以仅通过创建新文件来完成您想要进行的更改。如果答案是否,我必须更改现有文件,放弃。或者,fork lombok 并花半年时间弄清楚 javac、ecj 和 intellij 的内部工作原理:/
  • 如果您可以通过仅制作新文件来完成这项工作,请知道体验不会像 lombok 那样流畅和快速。以 lombok 为例,它不是一个普通的注解处理器。查找有关注释处理的任何教程/阅读 API/查看 AutoValue 等项目的源代码,以了解 'normal' 注释处理器如何工作的示例。知道你可以做你想做的事,所需要的只是你已经做过的事情:启用 'run processors' 复选框。

如@rzwitserloot 回答中所述, 不要使用 Lombok 作为学习注释的手段。

相反, 阅读注释教程。 以下是一些链接: