Android-黄油刀依赖注入源码,APT自动生成代码,利用javapoet语法搭建编译环境,建立MVP中空指针的保护机制
基本环境搭建
一、API采取背景
主要为了解决客户端MVP架构中,V层和P层生命周期不同步时,生成空View保护性逻辑。
之前需要手写空View的代码,现在通过注解配置可自动生成,同理于黄油刀的@ BindView 注解。
通过配置该注解,在编译期 (compileDebugJavaWithJavac)会自动生成Java类。
强制实现抽象方法getEmptyView(),点击emptyView(接口实例化的对象)
如果Iview需要添加新的方法,它的子类需要不断重写新的方法,这样就很麻烦,就可以通过APT解决(编译器生成代码),类似于ButterKnife来做这个框架
这里会引用到当前的Activity,他把我们当前的实例保存下来
如何保存的呐,就是通过
参考butterknife源码
通过注解的方法,在编译器里来修饰相应的一个类(或接口)
新建一个Module,这次不选Android Library(有自己的库和gradle脚本,可以存放视频和图片,体积过大) ,而是选Java Library(就是编译期生成的源码)更轻量级就行了
模仿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;
}
}
@AutoService(Processor.class)注解,这个注解会自动在指定路径下生成一个配置文件:
@SupportedAnnotationTypes注解,配置这个类所要处理的注解类型。(传入String类型参数,格式为:包名+类名);
@SupportedSourceVersion(SourceVersion.RELEASE_8)注解,JDK版本
MvpEmptyViewProcessor MVP空View Java代码生成器
这里的代码主要是用javapoet 这个库的语法通过该注解拿到的信息生成Java类。
大致逻辑:
- 获取被编译期注解修饰的类信息。
- 获取该类及父类结构里方法、参数、返回值信息。
- 根据这些信息生成该类的匿名对象。
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
三、经验总结
逻辑比较简单的场景,如逻辑较为复杂定位问题比较麻烦 其次 会影响编译速度。
可以看看黄油刀的源码,对更深层次的理解APT有很大帮助。
利用javapoet语法搭建编译环境
建立MVP中空指针的保护机制
上一篇: Android-SDK开发