欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android-黄油刀依赖注入源码,APT自动生成代码,利用javapoet语法搭建编译环境,建立MVP中空指针的保护机制

程序员文章站 2022-03-11 09:00:40
...

基本环境搭建

一、API采取背景

主要为了解决客户端MVP架构中,V层和P层生命周期不同步时,生成空View保护性逻辑。

之前需要手写空View的代码,现在通过注解配置可自动生成,同理于黄油刀的@ BindView 注解。

通过配置该注解,在编译期 (compileDebugJavaWithJavac)会自动生成Java类。

强制实现抽象方法getEmptyView(),点击emptyView(接口实例化的对象)

Android-黄油刀依赖注入源码,APT自动生成代码,利用javapoet语法搭建编译环境,建立MVP中空指针的保护机制

Android-黄油刀依赖注入源码,APT自动生成代码,利用javapoet语法搭建编译环境,建立MVP中空指针的保护机制

如果Iview需要添加新的方法,它的子类需要不断重写新的方法,这样就很麻烦,就可以通过APT解决(编译器生成代码),类似于ButterKnife来做这个框架

Android-黄油刀依赖注入源码,APT自动生成代码,利用javapoet语法搭建编译环境,建立MVP中空指针的保护机制

这里会引用到当前的Activity,他把我们当前的实例保存下来

如何保存的呐,就是通过

Android-黄油刀依赖注入源码,APT自动生成代码,利用javapoet语法搭建编译环境,建立MVP中空指针的保护机制

参考butterknife源码

Android-黄油刀依赖注入源码,APT自动生成代码,利用javapoet语法搭建编译环境,建立MVP中空指针的保护机制

通过注解的方法,在编译器里来修饰相应的一个类(或接口)

新建一个Module,这次不选Android Library(有自己的库和gradle脚本,可以存放视频和图片,体积过大) ,而是选Java Library(就是编译期生成的源码)更轻量级就行了

Android-黄油刀依赖注入源码,APT自动生成代码,利用javapoet语法搭建编译环境,建立MVP中空指针的保护机制

Android-黄油刀依赖注入源码,APT自动生成代码,利用javapoet语法搭建编译环境,建立MVP中空指针的保护机制

模仿ViewInject

@Retention(RUNTIME)  //运行时 注解
@Target(TYPE) // 类 接口 注解
public @interface ViewInject {
    int mainlayoutid()  default  -1;
}

参考文档 Android连载课程

二、APT的使用

1    新建两个Java Lib

仓库依赖来源 https://github.com/google/auto

第一个annotation  专门存放编译期注解。

第二个 apt 专门存放生成这个Java代码的注解处理器,并在Gradle添加两个外部包和自定义注解依赖。

implementation 'com.squareup:javapoet:1.9.0'
implementation 'com.google.auto.service:auto-service:1.0-rc3'
implementation project(':annotation')

分别是配合apt便捷生成java文件的工具及特定路径下生成配置文件。

2   注解处理器

继承AbstractProcessor并复写process方法同时添加下图三个注解

如果apt这个Module是Android Library是引用不到AbstractProcessor这个抽象的注解处理器,只有Java Library可以

@AutoService(Processor.class) //生成;APT的入口
@SupportedAnnotationTypes({"com.web.god.annotation.MvpEmptyViewFactory"})
public class MvpProccesor extends AbstractProcessor {
    public Filer mFiler;
    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        mFiler = processingEnv.getFiler();
        new MvpEmptyViewProcesor().process(roundEnv,this);
        return true;
    }
}

 

Android-黄油刀依赖注入源码,APT自动生成代码,利用javapoet语法搭建编译环境,建立MVP中空指针的保护机制

@AutoService(Processor.class)注解,这个注解会自动在指定路径下生成一个配置文件:

Android-黄油刀依赖注入源码,APT自动生成代码,利用javapoet语法搭建编译环境,建立MVP中空指针的保护机制

@SupportedAnnotationTypes注解,配置这个类所要处理的注解类型。(传入String类型参数,格式为:包名+类名);

Android-黄油刀依赖注入源码,APT自动生成代码,利用javapoet语法搭建编译环境,建立MVP中空指针的保护机制

@SupportedSourceVersion(SourceVersion.RELEASE_8)注解,JDK版本

MvpEmptyViewProcessor  MVP空View Java代码生成器

这里的代码主要用javapoet 这个库的语法通过该注解拿到的信息生成Java类。

 

大致逻辑:

 

  1. 获取被编译期注解修饰的类信息。
  2. 获取该类及父类结构里方法、参数返回值信息。
  3. 根据这些信息生成类的匿名对象。

 

https://github.com/square/javapoet

 

3   集成APT

 

       项目Gradle 文件 依赖上述两个Java Lib。

implementation project(':annotation')

        kapt/ annotationProcessor project(':apt')   (要看项目中是否有用 apply plugin: 'kotlin-kapt')

4   生成及调试

 

在想要生成的地方用编译期注解进行修饰,然后Rebuild项目。

 

APT 调试  https://blog.csdn.net/jonch_hzc/article/details/78796592 

三、经验总结

  1. 适用场景

 

逻辑比较简单的场景,如逻辑较为复杂定位问题比较麻烦 其次 会影响编译速度。

    1. 建议

 

可以看看黄油刀的源码,对更深层次的理解APT有很大帮助。

利用javapoet语法搭建编译环境

 

建立MVP中空指针的保护机制

相关标签: Android项目