需要有关注释处理器的帮助。我创建了一个简单的注释处理器,它使用@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 :(得分:1)
看起来你错过了一步。运行此项目的Maven构建将调用Google AutoService注释处理器,为您的registration file创建custom processor,并使用它构建 .jar 。为了使处理器正常工作,必须在编译包含Test
的项目之前将 .jar 作为依赖项包含在内。否则,Java ServiceLoader必须选择的注册文件在编译期间生成,显然不包含在编译器的类路径中。
答案 1 :(得分:0)
根据Baeldung的topic on annotation processor development,您必须先配置maven编译器插件,然后在此处声明自动服务注释处理器。那是缺少的步骤。仅供参考,如果您使用的是Gradle,则可以在依赖项关闭时声明它:
dependencies {
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc5'
compile 'com.google.auto.service:auto-service:1.0-rc5'
}