目前我正在尝试创建一个注释处理器,它在被注释的类中创建一个名为 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
中进行,但我不知道具体如何做。
有人可以帮助我吗?
谢谢!
通过您的设置,您最终将得到两个类
ExampleClass
:第一个是您注释的类,第二个是带有生成的 getter 的类。这可能会导致有趣的结果,但没有任何用处。
注释处理的一个众所周知的缺点是无法修改现有的源代码。
Lombok 等动态生成 getter 和 setter 等方法的工具/库将使用其他方式来完成工作。