使用注释处理器创建动态方法

问题描述 投票:0回答:1

目前我正在尝试创建一个注释处理器,它在被注释的类中创建一个名为 getValue 的方法。为此,我创建了以下类:

package ro.Gabriel.AnnotationTest;

import com.google.auto.service.AutoService;

import javax.annotation.processing.*;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.TypeElement;
import javax.tools.JavaFileObject;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Set;

@AutoService(javax.annotation.processing.Processor.class)
@SupportedAnnotationTypes("ro.Gabriel.AnnotationTest.CustomGetter")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class CustomGetterProcessor extends AbstractProcessor {

    @Override
    public synchronized void init(ProcessingEnvironment processingEnv) {
        super.init(processingEnv);
    }

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        for (Element element : roundEnv.getElementsAnnotatedWith(CustomGetter.class)) {
            if (element.getKind() == ElementKind.CLASS) {
                generateGetValueMethod((TypeElement) element);
            }
        }
        return true;
    }

    private void generateGetValueMethod(TypeElement classElement) {
        String className = classElement.getSimpleName().toString();
        String packageName = processingEnv.getElementUtils().getPackageOf(classElement).getQualifiedName().toString();

        String generatedClassName = className + "Generated";
        
        String generatedCode = String.format(
                "package %s;\n\n" +
                        "public class %s {\n" +
                        "    public String getValue() {\n" +
                        "        return \"Hello from getValue method!\";\n" +
                        "    }\n" +
                        "}\n",
                packageName, generatedClassName
        );

        try {
            JavaFileObject fileObject = processingEnv.getFiler().createSourceFile(
                    packageName + "." + generatedClassName, classElement);
            try (PrintWriter writer = new PrintWriter(fileObject.openWriter())) {
                writer.print(generatedCode);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这里是@CustomGetter注解类:

package ro.Gabriel.AnnotationTest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.TYPE)
public @interface CustomGetter { }

在资源文件夹中,我创建了以下目录:

META-INF/services
在文件中
resources/META-INF/services
我创建了以下文件:
javax.annotation.processing.Processor

javax.annotation.processing.Processor
中我添加了我的处理器:
ro.Gabriel.AnnotationTest.CustomGetterProcessor

pom.xml
文件中,我为
@AutoService(Processor.class)
添加了以下存储库:

        <dependency>
            <groupId>com.google.auto.service</groupId>
            <artifactId>auto-service</artifactId>
            <version>1.0.1</version>
            <scope>provided</scope>
        </dependency>

现在我创建了以下课程:

package ro.Gabriel.AnnotationTest;

@CustomGetter
public class ExampleClass {

}
ExampleClass e = new ExampleClass();
String value = e.getValue();// this method is not in the ExampleClass class even if it is annotated with @CustomGetter 

我的问题是为什么

getValue()
方法没有出现在ExampleClass类中?

我认为有些配置必须在

pom.xml
中进行,但我不知道具体如何做。

有人可以帮助我吗?

谢谢!

java annotations processor annotation-processing
1个回答
0
投票

通过您的设置,您最终将得到两个类

ExampleClass
:第一个是您注释的类,第二个是带有生成的 getter 的类。这可能会导致有趣的结果,但没有任何用处。

注释处理的一个众所周知的缺点是无法修改现有的源代码。

Lombok 等动态生成 getter 和 setter 等方法的工具/库将使用其他方式来完成工作。

© www.soinside.com 2019 - 2024. All rights reserved.