当前位置: 首页 > 知识库问答 >
问题:

注释处理器@autoservice

欧阳斌
2023-03-14

需要注释处理器的帮助。我创建了一个简单的注释处理器,它使用@autoservice注释来检查注释的字段是否为最终字段。但它没有显示任何编译时错误。这是我的配置

注释:

@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.FIELD)
public @interface Store {

    int temp() default 0;
}

注释处理器:

@SupportedAnnotationTypes("com.self.Store")
@AutoService(Processor.class)
public class Process extends AbstractProcessor {

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {

        for (Element element : roundEnv.getElementsAnnotatedWith(Store.class)) {

            TypeElement typeElement = (TypeElement) element;

            for (Element element2 : typeElement.getEnclosedElements()) {

                VariableElement variableElement = (VariableElement) element2;

                if (!variableElement.getModifiers().contains(Modifier.FINAL)) {

                    processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "it should be final");
                }

            }

        }

        return true;
    }

}

pom文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>annotations</groupId>
  <artifactId>annotations</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>annotation</name>
  <dependencies>
 <dependency>
      <groupId>com.google.auto.service</groupId>
      <artifactId>auto-service</artifactId>
      <version>1.0-rc2</version>
      <optional>true</optional>
    </dependency>
  </dependencies>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
         </configuration>
      </plugin>
    </plugins>
  </build>
</project>

测试文件:

public class Test {

     @Store
     public int id;
}

共有2个答案

何昆
2023-03-14

看起来你错过了一个步骤。运行这个项目的Maven构建将调用谷歌自动服务注释处理器,为你的自定义处理器创建一个注册文件,并用它构建一个. jar。为了让你的处理器工作,在编译包含Test的项目之前,必须将那个. jar作为依赖项包含在内。否则,必须由JavaServiceLoader获取的注册文件是在编译过程中生成的,显然不包括在编译器的类路径中。

孔欣荣
2023-03-14

根据Baeldung关于注释处理器开发的主题,您必须首先配置maven编译器插件,并在那里声明自动服务注释处理器。这是遗漏的一步。仅供参考,如果您使用Gradle,您可以在依存关系关闭下声明:

dependencies {
    annotationProcessor 'com.google.auto.service:auto-service:1.0-rc5'
    compileOnly 'com.google.auto.service:auto-service:1.0-rc5'
}
 类似资料:
  • 我正在使用注释处理器来处理方法参数的注释。 用于参数的注释类型有一个注释@参数 现在,当注释处理器运行时,我想检查参数注释()是否有参数注释。我通过执行以下代码来实现这一点。 由于某种原因,arg始终为空。是否有注释未返回的原因?

  • 我在编译使用我的注释处理器的代码时收到以下错误: 关于如何调试这个有什么提示吗?错误输出根本没有用处。有没有办法得到更详细的错误?

  • 建筑格拉德尔 注释 加工机 \资源\META-INF\javax.annotation.processing.处理器 注释消费者 建筑格拉德尔 这应该是一个非常简单的注释处理器,只是打印调试语句。对我来说,这一切似乎都是正确的,但是在我构建/运行项目2时没有运行。我也尝试过覆盖和。那没有做任何事情。也尝试过没有,那也没有改变任何事情。 编辑:为什么我可以获得

  • 问题内容: 在阅读 Java 中的自定义注释处理器的代码时,我注意到处理器方法中的这段代码: 碰巧我也在使用自定义注释处理器,所以我想在我的注释处理器中使用上面的代码段。 我以这种方式尝试了上面的代码: & 这条路: 但我没有注意到处理器行为的任何变化。我得到了支票,但看不到有什么用。 我想知道在处理特定回合时有用的用例。 问题答案: 这两项检查都很重要,但是直到在同一项目中一次运行多个注释处理器

  • 主要内容:使用Rem语句注释,注释使用::声明为创建的脚本添加注释或文档总是一个好习惯。 这是一个维护脚本用来理解脚本实际所做的事情所必需的注释。 例如,考虑下面这段没有注释形式的代码。 如果一个没有任何注释的脚本,普通人试图理解脚本,那么需要很多时间来理解脚本做些什么工作。 使用Rem语句注释 有两种方法可以在批处理脚本中创建注释; 一个是通过命令。 语句后的任何文本都将被视为注释,不会被执行。 以下是此声明的一般语法。 语法 其中是需要添

  • 在阅读Java中的自定义注释处理器的代码时,我注意到处理器的方法中的这段代码: 碰巧我也在处理一个自定义注释处理器&我想在我的注释处理器中使用上面的代码片段。 但是我没有注意到处理器的行为有任何变化。我得到了检查,但我看不出有什么用。 我想知道在处理某个回合时使用有用的用例。