注释处理器生成未创建文件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 后我的文件夹:

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...