2017-06-13 131 views
0

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

回答

0

看起来你错过了一个步骤。运行此项目的Maven构建将调用Google AutoService批注处理器,为您的custom processor创建一个registration file,并使用它创建一个.jar。为了让您的处理器工作,即的.jar必须作为一个依赖之前编译包含Test项目。否则在编译过程中生成Java ServiceLoader必须选取的注册文件将生成,并且显然不包含在编译器的类路径中。