Retrofit并不是网络请求框架,严格说只是对网络请求的一种封装,我们只需要定义一个接口类,在请求方法上加上相应的注解,甚至都不需要实现,就可以实现网络请求。但面试可就不只是要求会使用了,咱得知道内部是怎么实现的,才能顺利过关。
本篇内容,只是作为面试,提炼一下要点,建议还是先熟悉一下Retrofit的整个源码流程。关于retrofit完整源码解析,请回复【框架解析】获取视频讲解。
1、静态代理和动态代理
提到这个是因为,retrofit的精髓就在于内部的动态代理模式。
Java中的静态代理要求代理类(ProxySubject)和委托类(RealSubject)都实现同一个接口(Subject)。静态代理中代理类在编译期就已经确定,而动态代理则是JVM运行时动态生成,静态代理的效率相对动态代理来说相对高一些,但是静态代理代码冗余大,一旦需要修改接口,代理类和委托类都需要修改。
动态代理的两种实现方式:
JDK自带的java.lang.reflect.Proxy,只能代理接口类
CGLib,生产子类来实现方法增强,无需实现接口
Retrofit使用的就是JDK的动态代理。
2、简单介绍下retrofit实现原理
首先,通过Builder创建Retrofit对象,在create方法中,通过JDK动态代理的方式,生成实现类,在调用接口方法时,会触发InvocationHandler的invoke方法,将接口的空方法转换成ServiceMethid, 然后生成okhttp请求&