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的构建和创建工作。

参考:http://blog.csdn.net/maplejaw_/article/details/51942145

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章