简略分析Android的Retrofit应用开发框架源码

2019-12-10 19:05:30于丽

Retrofit源码分析
Retrofit整个项目中使用了动态代理和静态代理,如果你不太清楚代理模式,建议先google一下,如果对于Java的动态代理原理不是太熟悉,强烈建议先看:这篇文章-戏说代理和Java动态代理
ok,下面按照我们使用Retrofit发送请求的步骤来:

RestApi restApi = retrofit.create(RestApi.class);  //产生一个RestApi的实例

输入一个接口,直接输出一个实例。

这里岔开说一句,现在随便在百度上搜一下Java动态代理,出来一堆介绍AOP(面向切面编程)和Spring,导致一部分人本末倒置,认为动态代理几乎等于AOP,甚至有些人认为动态代理是专门在一个函数执行前和执行后添加一个操作,比如统计时间(因为现在几乎所有介绍动态代理的地方都有这个例子),害人不浅。实际上动态代理是JDK提供的API,并不是由这些上层建筑决定的,它还可以做很多别的事情,Retrofit中对动态代理的使用就是佐证。
搂一眼这里的源码,再次建议,如果这里代码看不明白,先看看上面提到的那篇文章:

public <T> T create(final Class<T> service) {
 //返回一个动态代理类的实例
 return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
  //这个InvocationHandler是关键所在,以后调用restapi接口中的方法都会被发送到这里
  new InvocationHandler() {
   private final Platform platform = Platform.get();

   @Override 
   public Object invoke(Object proxy, Method method, Object... args)
     throws Throwable {
    /* 如果是Object的方法,如toString()等,直接调用InvocationHandler的方法,
     *注意,这里其实是没有任何意义的,因为InvocationHandler其实是一个命令传送者
     *在动态代理中,这些方法是没有任何语义的,所以不需要在意
     */
    if (method.getDeclaringClass() == Object.class) {
     return method.invoke(this, args);
    }
    //对于Java8的兼容,在Android中不需要考虑
    if (platform.isDefaultMethod(method)) {
     return platform.invokeDefaultMethod(method, service, proxy, args);
    }
    //返回一个Call对象
    return loadMethodHandler(method).invoke(args);
   } 
  });
}