实战库ImplLoader
的介绍
首先来介绍一下实战项目的所解决的问题 : 当一个Android工程中如果已经使用不同的module来做业务隔离。那我们就可能有这种需求,module1想实例化一个module2的类,一般要怎么解决呢?
module1
依赖module2
- 把
module2
的这个类沉到底层库,然后module1
和module2
都使用这个底层库。 - ....等
下面来介绍一个小库 : ImplLoader
。可以很方便解决这个问题。只需这样使用即可:
- 使用
@Impl
标记需要被加载的类
//`module2`中的类:
@Impl(name = "module2_text_view")
public class CommonView extends AppCompatTextView {
}
- 使用
ImplLoader.getImpl("module2_text_view")
来获取这个类
public class Module1Page extends LinearLayout {
public Module1Page(@NonNull Context context) {
super(context);
init();
}
private void init() {
//根据name,获取需要加载的类
View module1Tv = ImplLoader.getView(getContext(), "module2_text_view");
addView(module1Tv);
}
}
- 初始化
ImplLoader
ImplLoader.init()
库的代码放在: https://github.com/SusionSuc/ImplLoader
为什么要写这个库 ?
主要是为了练手
在阅读WMRouter
和ARouter
源码时发现这两个库都用到了自定义注解
、自定义gradle插件
、Gradle Transfrom API
、javapoet和asm库
。而我对于这些知识很多我只是了解个大概,或者压根就没听说过。
因此ImplLoader
这个库主要是用来熟悉这个知识的。当然这个库的实现思路主要参考WMRouter
和ARouter
。
库的实现原理
用下面这种图概括一下:
其实整个库代码并不多,不过实现起来用到的东西不少,如果一些你使用的不熟悉,可以先看一下:
这个库是用来总结我这两年Android所学和对自我提高的一个库。里面的文章我写的很用心,会一直频繁更新。
下面简单过一下ImplLoader
的实现代码(只看主流程):
定义@Impl
注解
@Retention(RetentionPolicy.RUNTIME)
public @interface Impl {
String name() default "";
}
编译时注解处理器ImplAnnotationProcessor
, 扫描@Impl
,并生成ImplInfo_XXX.java
//ImplAnnotationProcessor.p