retrofit源码分析
一、这是创建Retrofit这个类,然后去加载IService接口文件
二、在Create方法中,加载IService的时候使用了动态代理,用来对方法进行包装
针对if (method.getDeclaringClass() == Object.class) {
return method.invoke(this, args);
}
然而动态代理对象里面的方法都是Interface规定的。但是动态代理对象也能调用比如toString(),hashCode()等这些方法呀,这些方法是所有类从Object继承过来的。
所以这个判断的根本作用就是,如果利用动态代理对象调用的是toString,hashCode,getClass等这些从Object类继承过来的方法,就直接反射调用。如果调用的是接口规定的方法。我们就用MapperMethod来执行。
结论:
1)、method.getDeclaringClass用来判断当前这个方法是哪个类的方法。
2)、接口创建出的代理对象不仅有实现接口的方法,也有从Object继承过来的方法
3)、实现的接口的方法method.getDeclaringClass是接口类型,比如com.atguigu.dao.EmpDao
从Object类继承过来的方法类型是java.lang.Object类型
4)、如果是Object类继承来的方法,直接反射调用
如果是实现的接口规定的方法,利用Mybatis的MapperMethod调用
三、关于ServiceMethod方法,这个方法是对传入的service方法具体解析,相当于一个bean,保存代理对象的类型等,在这一步一个ServiceMethod方法对应一个IService中的方法,加入到了一个ConcurrentHashMap中
首先会调用ServiceMethod的Builder方法,在这个方法中,获取了代理方法的所有泛型,参数泛型,以及参数泛型类型。
在Builder之后就开始了Build方法,这个方法比较长,我们一段一段的看。
四、ServuceMethod方法的Build方法
4.1创建了一个CallAdapter适配器和一个ResponseConverter转换器,并且对方法注解进行解析。
4.2 增加了一些错误判断,并进行抛出异常
4.3通过parseParameter对注解参数进行解析
五、在3.1方法中我们看到会调用parseMethodAnnotation方法,这个方法,提供了具体的解析某一种类型。并对这些类型进行了判断,
六、然后我们去看parseHttpMethodAndPath方法,用来得到注解的值
七、在3.3方法中还要对注解参数的解析,这个解析比解析代理方法的注解内容要多,判断也要多,摘录了一个Query分析一下,
到此Build构造完成。
八、经过三到七的操作,完成对代理类的解析,此时我们再来看二的内容,在OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);return serviceMethod.adapt(okHttpCall);的最后一句,其中serviceMethod.adapt(okHttpCall),这个方法会去调用ServiceMethod方法的adapt方法
从图中可以看出,要用到了callAdapter这个适配器
九、callAdapter的创建,此时又回到了Retrofit类的callAdapter
十、从callAdapterFactories中得到想要的callAdapter,在这里callAdater就是我们的第一步中的RxJava2CallAdapterFactory,会去调用RxJava2CallAdapterFactory的 adapter方法去适配,从而开始了RxJava的调用
到此,完成了对Retrofit的构建和创建工作。