美文网首页
Apt:annotationProcessor

Apt:annotationProcessor

作者: pure粹 | 来源:发表于2019-03-11 18:05 被阅读0次

    @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();
                 }
         }
    }

    相关文章

      网友评论

          本文标题:Apt:annotationProcessor

          本文链接:https://www.haomeiwen.com/subject/zwnbpqtx.html