返回
从零打造APT Demo,揭开Java注解处理器的神秘面纱
Android
2023-10-12 19:05:30
APT 简介
APT,全称 Annotation Processing Tool,是一种用于处理Java注解的工具。它允许你通过编码来动态解析注解,并根据解析结果生成Java代码。APT的应用场景非常广泛,包括代码生成、代码检查、代码优化等。
Demo 实现
现在,让我们动手编写一个最基本的APT Demo。
- 首先,我们需要创建一个新的Java项目,并添加必要的依赖项。这里,我们将使用Gradle作为构建工具。在你的项目中添加以下依赖项:
dependencies {
implementation 'com.google.auto.service:auto-service:1.0-rc7'
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc7'
compileOnly 'com.google.auto:auto-common:0.10'
}
- 接下来,我们需要创建一个新的注解。在你的项目中创建一个新的Java文件,并添加以下代码:
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface Flag {
String value();
}
这个注解叫做Flag
,它允许你给你的类添加一个标记。这个标记的值可以通过value()
方法获得。
- 现在,我们需要创建一个注解处理器来处理
Flag
注解。在你的项目中创建一个新的Java文件,并添加以下代码:
@AutoService(Processor.class)
public class FlagProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (TypeElement annotation : annotations) {
if (annotation.getQualifiedName().toString().equals("com.example.demo.Flag")) {
// 处理 Flag 注解
Set<? extends Element> annotatedElements = roundEnv.getElementsAnnotatedWith(annotation);
for (Element element : annotatedElements) {
// 生成 Java 代码
String className = element.getSimpleName().toString();
String flagValue = annotation.getAnnotation(Flag.class).value();
String generatedCode = "public class GeneratedClass" + className + " {\n" +
" public static String getFlagValue() {\n" +
" return \"" + flagValue + "\";\n" +
" }\n" +
"}";
JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile("com.example.demo.GeneratedClass" + className);
Writer writer = sourceFile.openWriter();
writer.write(generatedCode);
writer.close();
}
}
}
return true;
}
@Override
public Set<String> getSupportedAnnotationTypes() {
return Collections.singleton("com.example.demo.Flag");
}
@Override
public SourceVersion getSupportedSourceVersion() {
return SourceVersion.latestSupported();
}
}
这个注解处理器叫做FlagProcessor
,它实现了Processor
接口。process()
方法是注解处理器的主方法,它负责处理注解。在这个方法中,我们首先遍历所有被Flag
注解标注的元素,然后为每个元素生成Java代码。
- 最后,我们需要在你的项目中添加一个测试类。在你的项目中创建一个新的Java文件,并添加以下代码:
@Flag("Hello, world!")
public class MainActivity {
public static void main(String[] args) {
System.out.println(GeneratedClassMainActivity.getFlagValue());
}
}
这个测试类叫做MainActivity
,它被@Flag
注解标注,并且指定了标记值为Hello, world!
。
- 现在,你可以运行你的项目了。当你运行项目时,注解处理器将被调用,并为
MainActivity
类生成一个新的Java类,叫做GeneratedClassMainActivity
。这个类包含了一个getFlagValue()
方法,它返回标记值Hello, world!
。
总结
通过这个Demo,你学会了如何使用APT来动态解析注解,生成Java代码。APT是一个非常强大的工具,可以极大地提高你的开发效率。希望这个Demo能够帮助你更好地理解APT的原理和用法。