javapoet是可以快速的根据注解,然后动态生成代码的技术。
首先我们需要创建一个java lib 包,然后把想要扫描的注解注册上:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface MyAnnotation {
int action() default 0;
}
第二步:创建一个java lib包,进行代码的扫描添加工作:
首先 build.gradle 中需要依赖两个库:
implementation 'com.google.auto.service:auto-service:1.0-rc6'
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'
然后在创建一个 MyProcessor类继承 AbstractProcessor :
@AutoService(Processor.class) // 需要添加
public class MyProcessor extends AbstractProcessor {
private Filer mFiler;
private Elements mElementUtils;
private Messager mMessager;
private static final String PACK_NAME = "com.example.myqiyi.javapoet2";
@Override
public synchronized void init(ProcessingEnvironment processingEnvironment) {
super.init(processingEnvironment);
mFiler = processingEnv.getFiler();
mElementUtils = processingEnv.getElementUtils();
mMessager = processingEnv.getMessager();
System.out.println("MyProcessor ==> init");
}
@Override
public SourceVersion getSupportedSourceVersion() {
return SourceVersion.latestSupported(); // 版本
}
@Override
public Set<String> getSupportedAnnotationTypes() {
return Collections.singleton(MyAnnotation.class.getCanonicalName()); // 注解的类
}
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
System.out.println("MyProcessor ==> process");
MethodSpec main = MethodSpec.methodBuilder("main")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC) // 添加标识符 public static
.returns(void.class) // 返回类型
.addParameter(String[].class, "args") // 方法的参数
.addStatement("$T.out.println($S)", System.class, "Hello World!") // 方法里面的语句声明
.build();
TypeSpec hellWorld = TypeSpec.classBuilder("HelloWorld")
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
.addMethod(main)
.build();
JavaFile javaFile = JavaFile.builder(PACK_NAME, hellWorld).build();
try {
javaFile.writeTo(mFiler);
} catch (Exception e){
e.printStackTrace();
}
return false;
}
}
最后我们在 app中引入该库的依赖:
annotationProcessor project(':javapoetlib')
implementation project(path: ':annotationlib')
代码中使用:
@MyAnnotation(action = 2)
public void test(){
}
最后,编译完成生成代码: