学习源码的一般方法之Retrofit

初识一个框架之前,大概只知道其是用来解决什么问题。
而并不知道背后的原理以及原理的代码实现。

了解一个开源框架先了解背后的原理。

以Retrofit框架为例。

想要真正了解Retrofit框架背后的逻辑具体代表什么,先要明白HTTP协议原理。

这很有意义,只有这样才能融会贯通,形成体系,避免死记硬背,人的脑容量是有限的。

切入点:在使用框架的时候,离我们最近的方法

以Retrofit为例,看下面的代码:

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build();
    
GitHubService service = retrofit.create(GitHubService.class);
Call<List<Repo>> call = service.listRepos("octocat");

call.enqueue(new Callback<List<Repo>>() {
      @Override
      public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) {
      }

      @Override
      public void onFailure(Call<List<Repo>> call, Throwable t) {
      }
 });

这是Retrofit的一段使用示例,切入点是 call.enqueue(...)

在找到切入点之后就依托其继续深入

以Retrofit为例, call.enqueue(...) 深入之后发现 enqueue 是一个接口的方法声明,深入失败。

如果将框架示例看做是主线逻辑代码,那么切入点就是示例的最后一行代码。
当深入切入点失败之后,回退到切入点之前的代码。

以Retrofit为例,寻找 enqueue 之前的关键代码

终于发现 retrofit.create(GithubService.class) 其返回GitHubService接口的动态代理实现,然后回到主线,就可以知道call其实是动态代理调用listRepos(...)方法返回的对象,但是不知道具体实现。
listRepos(...)方法其实是调用动态代理的InvocationHandler.invoke(...)方法,所以继续深入invoke方法。

一个方法的逻辑往往最后一行可以作为切入点

InvocationHandler.invoke(...)为例

@Override
public Object invoke(Object proxy, Method method, @Nullable Object[] args)
   throws Throwable {
      // If the method is a method from Object then defer to normal invocation.
      if (method.getDeclaringClass() == Object.class) {
        return method.invoke(this, args);
      }
      if (platform.isDefaultMethod(method)) {
        return platform.invokeDefaultMethod(method, service, proxy, args);
      }
      return loadServiceMethod(method).invoke(args != null ? args : emptyArgs);
}

最后一行代码可以先看invoke方法,然后看loadServiceMethod方法,这样的一个阅读顺序分析得到Call对象生成的大致思路:

ServiceMethod  httpServiceMethod = (HttpServiceMethod Instance);
Call call = httpServiceMethod.invoke(args)

深入某个方法逻辑是一个横向的过程,而主线逻辑是一个纵向过程,当结束一段横向过程的时候,可以稍微停一下,并将横向结果代入主线,确保逻辑是否保持清晰。

然后可以再继续深入httpServiceMethod.invoke(args),循环上述方法一直追下去即可,就不一一详述了。

学习源码的一般方法大致就是如此:

找到纵向切入点,横向深入,回退,纵向梳理,横向深入、回退,纵向梳理。
反复如此这般即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值