Apt:annotationProcessor

2019-03-11  本文已影响0人  pure粹

@SupportedOptions(value = {"eventBusIndex","verbose"}):增加自定义参数
build.gradle:
defaultConfig {
     javaCompileOptions {
        annotationProcessorOptions {
             arguments = [eventBusIndex: 'org.greenrobot.eventbusperf.MyEventBusIndex']
         }
    }
}

一.创建java-library的Module:annotation
1.1创建注解类
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.FIELD)
public @interface BindView {
int value();
}

二:创建java-library的Mod:processor:implementation'com.google.auto.service:auto-service:1.0-rc4'
2.1自定义类BindViewProcessor:完成注解解析和生成自定义文件,
@AutoService(Processor.class):Google开发的,用来生成 META-INF/services/javax.annotation.processing.Processor 文件

@AutoService(Processor.class)
public class BindViewProcessor    extends AbstractProcessor

AbstractProcessor主要类和方法
Messager:日志辅助类
Filer:文件辅助类
Elements:元素辅助类
void init(ProcessingEnvironment processingEnv):初始化
public Set getSupportedAnnotationTypes()或@SupportedAnnotationTypes():处理注释类
process:处理核心方法

2.2process处理方式
方式一:拼接string字符串生成辅助类(MainActivity_ViewBind):
JavaFileObject jfo =processingEnv.getFiler().createSourceFile(proxyInfo.getProxyClassFullName(), proxyInfo.getTypeElement());
Writer writer = jfo.openWriter();
writer.write(proxyInfo.generateJavaCode());
writer.flush();
writer.close();

方式二:Poet生成:implementation'com.squareup:javapoet:1.7.0'
JavaFile javaFile = JavaFile.builder(proxyInfo.getPackageName(), proxyInfo.generateJavaCode2()).build();
// 生成文件
    javaFile.writeTo(processingEnv.getFiler());

三.创建Android的Module

public class BindViewTools {
    public static void bind(Activity activity) {
        Class clazz = activity.getClass();
             try {
                 Class bindViewClass = Class.forName(clazz.getName() + "_ViewBinding");
                 Method method = bindViewClass.getMethod("bind", activity.getClass());
                 method.invoke(bindViewClass.newInstance(), activity);
             } catch (Exception e) {
                 e.printStackTrace();
             }
     }
}

上一篇下一篇

猜你喜欢

热点阅读