返回

从零打造APT Demo,揭开Java注解处理器的神秘面纱

Android

APT 简介

APT,全称 Annotation Processing Tool,是一种用于处理Java注解的工具。它允许你通过编码来动态解析注解,并根据解析结果生成Java代码。APT的应用场景非常广泛,包括代码生成、代码检查、代码优化等。

Demo 实现

现在,让我们动手编写一个最基本的APT Demo。

  1. 首先,我们需要创建一个新的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'
}
  1. 接下来,我们需要创建一个新的注解。在你的项目中创建一个新的Java文件,并添加以下代码:
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface Flag {
    String value();
}

这个注解叫做Flag,它允许你给你的类添加一个标记。这个标记的值可以通过value()方法获得。

  1. 现在,我们需要创建一个注解处理器来处理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代码。

  1. 最后,我们需要在你的项目中添加一个测试类。在你的项目中创建一个新的Java文件,并添加以下代码:
@Flag("Hello, world!")
public class MainActivity {

    public static void main(String[] args) {
        System.out.println(GeneratedClassMainActivity.getFlagValue());
    }
}

这个测试类叫做MainActivity,它被@Flag注解标注,并且指定了标记值为Hello, world!

  1. 现在,你可以运行你的项目了。当你运行项目时,注解处理器将被调用,并为MainActivity类生成一个新的Java类,叫做GeneratedClassMainActivity。这个类包含了一个getFlagValue()方法,它返回标记值Hello, world!

总结

通过这个Demo,你学会了如何使用APT来动态解析注解,生成Java代码。APT是一个非常强大的工具,可以极大地提高你的开发效率。希望这个Demo能够帮助你更好地理解APT的原理和用法。