如何解决注释处理器生成未创建文件JavaPoet-AutoService
我正在尝试学习处理器生成,为此我使用 JavaPoet 和 Google AutoService。我用 maven-compiler-plugin 编译我的代码没有任何错误,出现了生成的源文件夹,但我看不到里面有任何生成的文件。
我也没有找到读取 processingEnv.getMessager 日志的方法,所以我现在完全卡住了。请帮忙。
这是我的处理器:
package com.annotationprocessing.demo;
import com.annotationprocessing.demo.annotation.NewLoginApplicable;
import com.google.auto.service.AutoService;
import com.squareup.javapoet.*;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Processor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
@SupportedAnnotationTypes("com.annotationprocessing.demo.annotation.NewLoginApplicable.java")
@AutoService(Processor.class)
public class NewLoginInterceptorProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations,RoundEnvironment roundEnv) {
// The elements which have NewLoginApplicable annotation
Set<? extends Element> annotatedElements = roundEnv
.getElementsAnnotatedWith(NewLoginApplicable.class);
Map<Boolean,List<Element>> annotatedMethods = annotatedElements.stream().collect(
Collectors.partitioningBy(element -> element.getKind() == ElementKind.METHOD));
Set<Element> annotatedCorrectly = new HashSet<>(annotatedMethods.get(true));
List<Element> faulty = annotatedMethods.get(false);
faulty.forEach(element -> processingEnv.getMessager().printMessage(
Diagnostic.Kind.ERROR,"NewLoginApplicable annotation should only be used on methods ",element));
String className = "NewLoginApplicableMap";
typespec typespec = buildClasstypespec(annotatedCorrectly,className);
String packageName = "com.annotationprocessing.demo";
if (typespec != null) {
try {
writetoFile(typespec,packageName);
} catch (IOException e) {
e.printstacktrace();
}
}
return true;
}
private static typespec buildClasstypespec(Set<? extends Element> elements,String className) {
if (elements.isEmpty())
return null;
ClassName hashmap = ClassName.get("java.util","HashMap");
String hashmapObjectName = "getEndpointMap";
typespec.Builder typespecBuilder = typespec.classBuilder(className)
.addModifiers(Modifier.PUBLIC);
FieldSpec fieldSpec = FieldSpec.builder(HashMap.class,hashmapObjectName,Modifier.PRIVATE,Modifier.STATIC).initializer("new HashMap()").build();
typespecBuilder.addField(fieldSpec);
MethodSpec.Builder getterMethodBuilder = MethodSpec.methodBuilder(hashmapObjectName)
.returns(HashMap.class)
.addModifiers(Modifier.PUBLIC)
.addModifiers(Modifier.STATIC)
.addStatement("return this.endpointMap()");
typespecBuilder.addMethod(getterMethodBuilder.build());
return typespecBuilder.build();
}
private void writetoFile(typespec typespec,String packageName) throws IOException {
JavaFile.builder(packageName,typespec).build().writeto(processingEnv.getFiler());
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE,"Code generation complete!");
}
}
mvn compile 后我的文件夹:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。