注解处理器@autoservice

6
需要关于注解处理器的帮助。我创建了一个简单的注解处理器,使用了@autoservice注解来检查被注释的字段是否是final的。但它没有显示任何编译时错误。这是我的配置。
注解:
@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个回答

13
根据Baeldung网站上有关注解处理器开发的主题,您首先必须配置Maven编译器插件,并在其中声明Auto-Service注解处理器。这是缺失的步骤。如果您使用Gradle,可以在dependencies闭包下声明它。

根据Baeldung的注解处理器开发主题,你需要先配置你的Maven编译器插件并在其中声明auto-service注解处理器。这是缺失的一步。另外,如果你使用Gradle,你可以在dependencies闭包中声明它。

dependencies {
    annotationProcessor 'com.google.auto.service:auto-service:1.0-rc5'
    compileOnly 'com.google.auto.service:auto-service:1.0-rc5'
}

2

看起来你漏掉了一步。运行此项目的Maven构建将调用Google的AutoService注解处理器,创建一个注册文件用于你的自定义处理器并生成一个.jar文件。为使你的处理器生效,该.jar文件必须在包含Test的项目编译之前作为依赖项被包含。否则,在编译包含代码Test的项目期间生成的注册文件不会被编译器的类路径所包含,显然也无法被Java ServiceLoader检测到。


你的帖子非常奇怪。错过一步是一回事,循环依赖的问题完全是另一回事。你在说什么? - Gangnus
1
@Gangnus,循环依赖?为什么?在我看来,这不是X依赖于Y,而Y又依赖于X(即使有中间件)。这只是试图在一步中运行应该分两步完成的事情。我假设您对Java注释处理、Java SPI和Google的AutoService有一定的了解,以便理解我的答案。您不能同时生成注释处理器并在同一运行中应用它。 - vempo
抱歉,我仍然不理解您的帖子。在我看来,“否则,在编译期间生成必须由Java ServiceLoader拾取的注册文件,显然不包括在内”,这可能涉及到循环依赖。 - Gangnus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接