SPI机制
实现模块间通信,比如运营模块aar调用订单模块中的数据,实现模块间解耦
在运行期间将接口转换为实现类,达到模块间调用
variant.javaCompile.classpath包含所有的class文件和第三方的jar包
任务运行在javaCompileTask之后,
1.自定义Gradle插件,使用javassit扫描带有注解@ServiceProvider修饰的接口实现类,建立接口和实现类的映射关系
2.使用javapot生成接口和实现类映射关系的java文件ServiceRegistry,然后编译这个java文件
3.在模块中调用ServiceLoader.load(ITest.Class)获取接口实现类进行调用
ServiceLoader<S> implements Iterable<S>
ServiceLoader.load(ITest.Class) -> Class TestClass= ServiceRegistry.get(ITest.Class)->获取TestClass.newInstance();
就是说服务调用的时候才创建接口实例。
ServiceRegistry内部维护了集合
HashMap<ITest.Class,Set<ITest.Class的子类>> map;//接口类和实现类的Class字节码映射表
一个接口类可以有多个实现类