添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Android工程师必备基础技能(三)Retrofit中的注解原理项目实践

Android工程师必备基础技能(三)Retrofit中的注解原理项目实践

如果想整体性的学习,可以从上一篇看起
Android工程师必备基础技能(一)注解
Android工程师必备基础技能(二)泛型

由于本篇代码过多,字数上限,所以部分代码省略掉了,有兴趣的可以留言

1. Retrofit2.0 原理解析

目前的网络框架基本上都是使用 Retrofit + okhttp 一起进行使用,那么我们来看看 retrofit 究竟做了些什么。

结合之前的 OkHttp 源码解析,在这个的基础上加上了 Retrofit ,下面是正常使用时候的代码。

2.初始化 Retrofit

private void initRetrofit() {
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(new TokenHeaderInterceptor()) // 动态添加token
                .addInterceptor(new NullResponseInterceptor()) // 返回空字符的时候显示
                .connectTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS)
                .writeTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS)
                .readTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS)
                .build();
        // JSON 问题的解析处理 Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1
        Gson gson = new GsonBuilder().setLenient().create();
        retrofit = new Retrofit.Builder() // 使用建造者模式
                .baseUrl(Constant.HTTP_URL) // 请求host
                .client(client) // okhttp实例对象
                .addConverterFactory(WGsonConverterFactory.create(gson)) // 添加 转换器工厂
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 请求指定适配器 RxJava
                .build();
    }

上面的代码是对 Retrofit 进行一个初始化的操作。
Retrofit # Builder()

Builder(Platform platform) { 
     // 将平台信息赋值给成员变量platform
      this.platform = platform;
    public Builder() { 
      // 获取平台相关信息
      this(Platform.get());
    }

Platform # get()

private static final Platform PLATFORM = findPlatform();
    static Platform get() {
      return PLATFORM;
    private static Platform findPlatform() {
      try {
        Class.forName("android.os.Build");
        if (Build.VERSION.SDK_INT != 0) { // 如果是Android平台就创建实例Android()
          return new Android();
      } catch (ClassNotFoundException ignored) {
      try {
        Class.forName("java.util.Optional");
        return new Java8();
      } catch (ClassNotFoundException ignored) {
      return new Platform();
    }

Android 是 Platform 里面的一个静态内部类。
Platform # Android

static class Android extends Platform {
      @IgnoreJRERequirement // Guarded by API check.
      @Override boolean isDefaultMethod(Method method) {
        if (Build.VERSION.SDK_INT < 24) { // 小于7.0
          return false;
        return method.isDefault();
      @Override public Executor defaultCallbackExecutor() {
        return new MainThreadExecutor(); // 实例化一个在主线程执行的线程
      @Override List<? extends CallAdapter.Factory> 
      defaultCallAdapterFactories(
          @Nullable Executor callbackExecutor) {
        if (callbackExecutor == null) throw new AssertionError();
        ExecutorCallAdapterFactory executorFactory = new ExecutorCallAdapterFactory(callbackExecutor);
        return Build.VERSION.SDK_INT >= 24
          ? asList(CompletableFutureCallAdapterFactory.INSTANCE, executorFactory) // 完成请求返回适配器工厂,执行请求工厂
          : singletonList(executorFactory); // 只有一个执行请求工厂
      @Override int defaultCallAdapterFactoriesSize() { // 默认请求适配器工厂数量
        return Build.VERSION.SDK_INT >= 24 ? 2 : 1; // 大于7.0 2个 其他 1个
      @Override List<? extends Converter.Factory> defaultConverterFactories() { // 默认转换器工厂
        return Build.VERSION.SDK_INT >= 24
            ? singletonList(OptionalConverterFactory.INSTANCE)
            : Collections.<Converter.Factory>emptyList();
      @Override int defaultConverterFactoriesSize() { // 默认转换器数量
          return Build.VERSION.SDK_INT >= 24 ? 1 : 0;
      // 在主线程中进行执行的线程,使用Handler进行线程切换。
      static class MainThreadExecutor implements Executor {
        private final Handler handler = new Handler(Looper.getMainLooper());
        @Override public void execute(Runnable r) {
          handler.post(r);
    }

.baseUrl(Constant.HTTP_URL)

public Builder baseUrl(String baseUrl) {
      checkNotNull(baseUrl, "baseUrl == null"); 
      // 对其判空处理 空 抛出异常
      return baseUrl(HttpUrl.get(baseUrl));
    }

HttpUrl.get(baseUrl)

public static HttpUrl get(String url) {
    return new Builder().parse(null, url).build(); 
    // 建造者模式
  }

new Builder().parse(null, url)

Builder parse(@Nullable HttpUrl base, String input) {
      // 如果前面或者后面有 \t \r \n \f 空格 进行处理
      int pos = skipLeadingAsciiWhitespace(input, 0, input.length()); // 获取input前面有效字符所在的index值 
      int limit = skipTrailingAsciiWhitespace(input, pos, input.length()); // 获取input后面有效字符所在的index值
      // Scheme. 返回输入中在scheme字符之后的“:”索引。如果输入没有从pos开始的方案,则返回-1。
      // inputs长度小于2,input的pos位置不为a-z或者A-Z的字符直接返回-1 
      int schemeDelimiterOffset = schemeDelimiterOffset(input, pos, limit); // 拿到scheme所在位置的index值
      if (schemeDelimiterOffset != -1) {
        if (input.regionMatches(true, pos, "https:", 0, 6)) { // 获取input请求是否是https请求
          this.scheme = "https";
          pos += "https:".length(); // 确定请求方式https pos开始向右走
        } else if (input.regionMatches(true, pos, "http:", 0, 5)) { // 获取input请求是否是http请求
          this.scheme = "http";
          pos += "http:".length(); // 确定请求方式http pos开始向右走
        } else { // 如果是其他类型 抛出异常
          throw new IllegalArgumentException("Expected URL scheme 'http' or 'https' but was '"
              + input.substring(0, schemeDelimiterOffset) + "'");
      } else if (base != null) { // 由上面的代码可以知道这里的base是null
        this.scheme = base.scheme;
      } else { // 其他情况 抛出异常
        throw new IllegalArgumentException(
            "Expected URL scheme 'http' or 'https' but no colon was found");
      // Authority.
      boolean hasUsername = false;
      boolean hasPassword = false;
      // 如果 input = "https://www.baidu.com"
      // 前面已经确定了https:    下面的方法确定了  https:// pos+=2
      int slashCount = slashCount(input, pos, limit); // 进行跳过双斜杠 或者反义符斜杆 得到// 的数量 这里是 2
      if (slashCount >= 2 || base == null || !base.scheme.equals(this.scheme)) {
        pos += slashCount; 
        authority:
        while (true) {
          // 从pos开始到limit位置都不包含这些字符就返回limit  www.baidu.com 不包含 返回limit
          int componentDelimiterOffset = delimiterOffset(input, pos, limit, "@/\\?#");
          int c = componentDelimiterOffset != limit
              ? input.charAt(componentDelimiterOffset)
              : -1; // 执行这个
          switch (c) { // c = -1
            case '@': // @情况特殊
              // User info precedes.
              if (!hasPassword) { // 由上面代码可知  这里是false值
                int passwordColonOffset = delimiterOffset(
                    input, pos, componentDelimiterOffset, ':'); // 判断剩余字符中是否含有:字符 并返回下标值
                // 通过以下转换返回[pos..limit]范围内输入的子字符串:跳过制表符、换行符、换行符和回车符。在查询中,“”被编码为“+”,而“+”被编码为“%2B”。
                // encodeSet中的字符是百分比编码的。控制字符和非ASCII字符采用百分比编码。所有其他字符都被复制而不进行转换。
                String canonicalUsername = canonicalize(
                    input, pos, passwordColonOffset, USERNAME_ENCODE_SET, true, false, false, true,
                    null);
                this.encodedUsername = hasUsername
                    ? this.encodedUsername + "%40" + canonicalUsername
                    : canonicalUsername; // 拿到编码用户名
                if (passwordColonOffset != componentDelimiterOffset) {
                  hasPassword = true;
                  this.encodedPassword = canonicalize(input, passwordColonOffset + 1,
                      componentDelimiterOffset, PASSWORD_ENCODE_SET, true, false, false, true,
                      null); // 拿到编码密码
                hasUsername = true;
              } else {
                this.encodedPassword = this.encodedPassword + "%40" + canonicalize(input, pos,
                    componentDelimiterOffset, PASSWORD_ENCODE_SET, true, false, false, true,
                    null); // 拿到编码密码
              pos = componentDelimiterOffset + 1;
              break;
            case -1:
            case '/':
            case '\\':
            case '?':
            case '#':
              // 根据上面分析 componentDelimiterOffset = limit   查找输入中的第一个“:”,在大括号“[…]”之间跳过字符
              int portColonOffset = portColonOffset(input, pos, componentDelimiterOffset); // 返回也是limit
              if (portColonOffset + 1 < componentDelimiterOffset) { // 条件不满足 如果字符中含有接口 即满足条件 例如 127.0.0.1:8080
                host = canonicalizeHost(input, pos, portColonOffset); // 如果www.baidu.com含有%转为utf-8字符 如果包含[]则需要去除字符
                port = parsePort(input, portColonOffset + 1, componentDelimiterOffset); // 解析端口号 如果在 0 - 65535之间则返回,否则返回-1
                if (port == -1) { // 端口号不对抛出异常
                  throw new IllegalArgumentException("Invalid URL port: \""
                      + input.substring(portColonOffset + 1, componentDelimiterOffset) + '"');
              } else {
                host = canonicalizeHost(input, pos, portColonOffset); // 解析host
                port = defaultPort(scheme); // 解析端口号
              if (host == null) {
                throw new IllegalArgumentException(
                    INVALID_HOST + ": \"" + input.substring(pos, portColonOffset) + '"');
              pos = componentDelimiterOffset;
              break authority;
      } else {
        // This is a relative link. Copy over all authority components. Also maybe the path & query.
        this.encodedUsername = base.encodedUsername();
        this.encodedPassword = base.encodedPassword();
        this.host = base.host;
        this.port = base.port;
        this.encodedPathSegments.clear();
        this.encodedPathSegments.addAll(base.encodedPathSegments());
        if (pos == limit || input.charAt(pos) == '#') {
          encodedQuery(base.encodedQuery());
      // Resolve the relative path.
      int pathDelimiterOffset = delimiterOffset(input, pos, limit, "?#"); // pos-limit字段是否含有?# 获取最近的一个下标值
      resolvePath(input, pos, pathDelimiterOffset); // 会在最后一个encodedPathSegments集合中设置为“”空字符串
      pos = pathDelimiterOffset;
      // Query.
      if (pos < limit && input.charAt(pos) == '?') { // 有参数的情况
        int queryDelimiterOffset = delimiterOffset(input, pos, limit, '#');
        this.encodedQueryNamesAndValues = queryStringToNamesAndValues(canonicalize( // 获取参数名称和值value
            input, pos + 1, queryDelimiterOffset, QUERY_ENCODE_SET, true, false, true, true, null));
        pos = queryDelimiterOffset;
      // Fragment.
      if (pos < limit && input.charAt(pos) == '#') { // 锚点位置解析
        this.encodedFragment = canonicalize(
            input, pos + 1, limit, FRAGMENT_ENCODE_SET, true, false, false, false, null);
      return this;
    }

HttpUrl # Builder # build()

public HttpUrl build() {
      if (scheme == null) throw new IllegalStateException("scheme == null");
      if (host == null) throw new IllegalStateException("host == null");
      return new HttpUrl(this); 
      // 使用上面所有的参数创建一个httpUrl实例对象 这里的this为Builder
    }

HttpUrl(this) 这里的 this 指 Builder

HttpUrl(Builder builder) { // 对build之前设置的数据进行初始化赋值
    this.scheme = builder.scheme;
    this.username = percentDecode(builder.encodedUsername, false); // % 字符编码utf-8处理
    this.password = percentDecode(builder.encodedPassword, false);
    this.host = builder.host;
    this.port = builder.effectivePort();
    this.pathSegments = percentDecode(builder.encodedPathSegments, false);
    this.queryNamesAndValues = builder.encodedQueryNamesAndValues != null
        ? percentDecode(builder.encodedQueryNamesAndValues, true)
        : null;
    this.fragment = builder.encodedFragment != null
        ? percentDecode(builder.encodedFragment, false)
        : null;
    this.url = builder.toString();
  }

baseUrl(HttpUrl.get(baseUrl))

public Builder baseUrl(HttpUrl baseUrl) {
      checkNotNull(baseUrl, "baseUrl == null"); // 判空处理
      List<String> pathSegments = baseUrl.pathSegments(); // 获取 pathSegments 
      if (!"".equals(pathSegments.get(pathSegments.size() - 1))) { // 默认为“”
        throw new IllegalArgumentException("baseUrl must end in /: " + baseUrl);
      this.baseUrl = baseUrl;
      return this;
    }

.client(client)

public Builder client(OkHttpClient client) { // 设置 callFactory
      return callFactory(checkNotNull(client, "client == null")); // 判空
    }

.addConverterFactory(WGsonConverterFactory.create(gson)) 设置转换器工厂

public Builder addCallAdapterFactory(CallAdapter.Factory factory) {
      callAdapterFactories.add(checkNotNull(factory, "factory == null")); // 添加到请求适配器工厂集合中
      return this;
    }

new Retrofit.Builder().build(); 开始创建Retrofit实例

public Retrofit build() {
      if (baseUrl == null) {
        throw new IllegalStateException("Base URL required.");
      okhttp3.Call.Factory callFactory = this.callFactory; // client 不为null
      if (callFactory == null) {
        callFactory = new OkHttpClient();
      Executor callbackExecutor = this.callbackExecutor; // 请求返回执行线程
      if (callbackExecutor == null) {
        callbackExecutor = platform.defaultCallbackExecutor(); // Android平台默认是通过Handler在主线程中进行执行
      // Make a defensive copy of the adapters and add the default Call adapter.
      List<CallAdapter.Factory> callAdapterFactories = new ArrayList<>(this.callAdapterFactories);
      callAdapterFactories.addAll(platform.defaultCallAdapterFactories(callbackExecutor));
      // Make a defensive copy of the converters. defaultConverterFactoriesSize大于等于7.0 size为1 否则为0
      List<Converter.Factory> converterFactories = new ArrayList<>(
          1 + this.converterFactories.size() + platform.defaultConverterFactoriesSize());
      // Add the built-in converter factory first. This prevents overriding its behavior but also
      // ensures correct behavior when using converters that consume all types.
      converterFactories.add(new BuiltInConverters());
      converterFactories.addAll(this.converterFactories);
      converterFactories.addAll(platform.defaultConverterFactories()); // 默认的转换器工厂
      // Retrofit对象的实例化
      return new Retrofit(callFactory, baseUrl, unmodifiableList(converterFactories),
          unmodifiableList(callAdapterFactories), callbackExecutor, validateEagerly);
  }

参数赋值,进行实例化Retrofit对象。

Retrofit(okhttp3.Call.Factory callFactory, HttpUrl baseUrl,
      List<Converter.Factory> converterFactories, List<CallAdapter.Factory> callAdapterFactories,
      @Nullable Executor callbackExecutor, boolean validateEagerly) {
    this.callFactory = callFactory;
    this.baseUrl = baseUrl;
    this.converterFactories = converterFactories; // Copy+unmodifiable at call site.
    this.callAdapterFactories = callAdapterFactories; // Copy+unmodifiable at call site.
    this.callbackExecutor = callbackExecutor;
    this.validateEagerly = validateEagerly;
  }

3.调用

public interface InterfaceApi { // 接口类
     *  根据用户id更新用户信息
     * @return
    @POST("/api/watch/account/update/{id}")
    Observable<BaseJson<ResponseUserInfoBean>> updateUserInfoUseId(@Path("id") long userId,
                                                                   @Body RequestBody json);
}

代码调用请求接口

RetrofitManager.getInstance().requestData(InterfaceApi.class)
                .updateUserInfoUseId(userId,RequestBodyUtils.getRequestBody(new Gson().toJson(bean)))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new BaseObserver<BaseJson<ResponseUserInfoBean>>() {
                    @Override
                    public void startAnalysis() {}
                    @Override
                    public void getData(BaseJson<ResponseUserInfoBean> data) {
                        mUpdateUserInfo.setValue(data.getData());
                    @Override
                    public void onErrorInfo(Throwable e) {
                        mUpdateUserInfo.setValue(null);
                        mView.showToast(e.getMessage());
                });

请求数据会进行调用这个方法, retrofit 调用了 create

public <T> T requestData(Class<T> tClass){
        return retrofit.create(tClass);
    }

retrofit.create(tClass);

public <T> T create(final Class<T> service) {
    Utils.validateServiceInterface(service); // 判断service的类对象是否是接口类型 并且没有派生自其它接口类
    if (validateEagerly) { // 上面代码未进行设置 默认为 false
      eagerlyValidateMethods(service);
    // service.getClassLoader() 拿取当前接口执行类的类加载器 PathClassLoader
    // 代理对象 service 接口类
    // 动态代理模式执行数据的请求
    return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
        new InvocationHandler() {
          private final Platform platform = Platform.get();
          private final Object[] emptyArgs = new Object[0];
          // 代理对象是service的远程代理 method 是当前service执行的方法名 args是当前方法执行的所有参数集合
          @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.
            // method.getDeclaringClass() 当前方法所属的类class 目前我这里是接口类InterfaceApi.class 不是Object.class
            if (method.getDeclaringClass() == Object.class) { // 所以不会通过这个方法 
              return method.invoke(this, args); // 按照正常调用执行方法
            if (platform.isDefaultMethod(method)) { // 是否是默认方法 是的情况 正常调用 Java8特性 可以不管
              return platform.invokeDefaultMethod(method, service, proxy, args);
            return loadServiceMethod(method).invoke(args != null ? args : emptyArgs);
  }

eagerlyValidateMethods(service);

private void eagerlyValidateMethods(Class<?> service) {
    Platform platform = Platform.get(); // 拿取到Android平台对象
    for (Method method : service.getDeclaredMethods()) { // 获取service接口内所有private修饰的方法
      if (!platform.isDefaultMethod(method)) { // 判断 非Android平台默认的方法 则执行下面操作
        loadServiceMethod(method);
  }

loadServiceMethod(method);

ServiceMethod<?> loadServiceMethod(Method method) {
    ServiceMethod<?> result = serviceMethodCache.get(method); // 从集合中去获取这个方法
    if (result != null) return result; // 如果已经存在,则返回
    synchronized (serviceMethodCache) { // Map集合中不存在 加锁进行处理 ,保证方法的唯一性
      result = serviceMethodCache.get(method); // 再一次进行获取
      if (result == null) { // 当前方法依旧不存在
        result = ServiceMethod.parseAnnotations(this, method); // 解析当前方法
        serviceMethodCache.put(method, result); // 将当前解析之后的方法放入到集合中
    return result;
  }

ServiceMethod 属于抽象类,只有两个方法 parseAnnotations 和 invoke

abstract class ServiceMethod<T> {
  static <T> ServiceMethod<T> parseAnnotations(Retrofit retrofit, Method method) {
    // 对当前方法的所有信息进行解析 方法上的注解 方法参数注解 方法参数值等一系列的解析
    RequestFactory requestFactory = RequestFactory.parseAnnotations(retrofit, method); 
    Type returnType = method.getGenericReturnType(); // 获取当前方法返回类型类
    if (Utils.hasUnresolvableType(returnType)) { // 判断返回类型是否是T 或者 通配符类型
      throw methodError(method,
          "Method return type must not include a type variable or wildcard: %s", returnType);
    if (returnType == void.class) { // 返回类型为 空 
      throw methodError(method, "Service methods cannot return void.");
    // 实例化HttpServiceMethod对象
    return HttpServiceMethod.parseAnnotations(retrofit, method, requestFactory);
  abstract T invoke(Object[] args);
}

RequestFactory.parseAnnotations(retrofit, method);

final class RequestFactory {
  static RequestFactory parseAnnotations(Retrofit retrofit, Method method) {
    return new Builder(retrofit, method).build(); // 建造者模式
}

new Builder(retrofit, method);

Builder(Retrofit retrofit, Method method) {
      this.retrofit = retrofit; // retrofit实例
      this.method = method; // 当前调用方法
      this.methodAnnotations = method.getAnnotations(); // 获取当前方法注解集合 eg:@POST
      // 获取当前方法传入参数类型集合 eg (String url) String.class 
      // 如果当前数据传入的参数有泛型类型的参数 这个方法可以返回泛型的完整信息 eg:(List<String> list) java.util.List<java.lang.String>
      // getParameterTypes(); 这个方法仅返回泛型信息 eg:(List<String> list) java.util.List
      this.parameterTypes = method.getGenericParameterTypes(); 
      // 获取当前方法传入参数的注解集合 eg (@Query("name") String name)
      this.parameterAnnotationsArray = method.getParameterAnnotations();
    }

new Builder(retrofit, method).build() 方法

RequestFactory build() {
      for (Annotation annotation : methodAnnotations) { // 遍历作用方法上面的注解集合
        parseMethodAnnotation(annotation); // 进行解析
      if (httpMethod == null) { // 请求方式注解是否为null
        throw methodError(method, "HTTP method annotation is required (e.g., @GET, @POST, etc.).");
      if (!hasBody) { // 是否有请求体 parseMethodAnnotation 由这个方法体现 DELETE GET OPTIONS HEAD 为false
        if (isMultipart) { // 没有请求体但是是表单提交(带有文件)
          throw methodError(method,
              "Multipart can only be specified on HTTP methods with request body (e.g., @POST).");
        if (isFormEncoded) { // 是否是表单提交
          throw methodError(method, "FormUrlEncoded can only be specified on HTTP methods with "
              + "request body (e.g., @POST).");
      int parameterCount = parameterAnnotationsArray.length; // 参数注解长度
      parameterHandlers = new ParameterHandler<?>[parameterCount]; // 创建ParameterHandler集合对象
      for (int p = 0; p < parameterCount; p++) {
        // 对参数注解进行逐一解析
        parameterHandlers[p] = parseParameter(p, parameterTypes[p], parameterAnnotationsArray[p]);
      if (relativeUrl == null && !gotUrl) {
        throw methodError(method, "Missing either @%s URL or @Url parameter.", httpMethod);
      if (!isFormEncoded && !isMultipart && !hasBody && gotBody) {
        throw methodError(method, "Non-body HTTP method cannot contain @Body.");
      if (isFormEncoded && !gotField) {
        throw methodError(method, "Form-encoded method must contain at least one @Field.");
      if (isMultipart && !gotPart) {
        throw methodError(method, "Multipart method must contain at least one @Part.");
      return new RequestFactory(this); // 实例化请求工厂对象
    }

parseMethodAnnotation(annotation); 作用于方法上面的注解进行解析

private void parseMethodAnnotation(Annotation annotation) {
      if (annotation instanceof DELETE) {
        parseHttpMethodAndPath("DELETE", ((DELETE) annotation).value(), false); // hasBody给的false
      } else if (annotation instanceof GET) {
        parseHttpMethodAndPath("GET", ((GET) annotation).value(), false); // hasBody给的false
      } else if (annotation instanceof HEAD) {
        parseHttpMethodAndPath("HEAD", ((HEAD) annotation).value(), false); // hasBody给的false
      } else if (annotation instanceof PATCH) {
        parseHttpMethodAndPath("PATCH", ((PATCH) annotation).value(), true); // hasBody给的true
      } else if (annotation instanceof POST) {
        parseHttpMethodAndPath("POST", ((POST) annotation).value(), true); // hasBody给的true
      } else if (annotation instanceof PUT) {
        parseHttpMethodAndPath("PUT", ((PUT) annotation).value(), true); // hasBody给的true
      } else if (annotation instanceof OPTIONS) {
        parseHttpMethodAndPath("OPTIONS", ((OPTIONS) annotation).value(), false);  // hasBody给的false
      } else if (annotation instanceof HTTP) {
        HTTP http = (HTTP) annotation; // 如果注解为@HTTP,即传入http相关信息进行解析
        parseHttpMethodAndPath(http.method(), http.path(), http.hasBody()); // hasBody默认为false 实际值需要看注解中给的是什么
      } else if (annotation instanceof retrofit2.http.Headers) { // 如果添加了Headers请求头集合
        String[] headersToParse = ((retrofit2.http.Headers) annotation).value();
        if (headersToParse.length == 0) { // 获取集合为null 抛出异常
          throw methodError(method, "@Headers annotation is empty.");
        headers = parseHeaders(headersToParse); // 解析请求头相关信息
      } else if (annotation instanceof Multipart) { // 表单提交(含有文件)类型
        if (isFormEncoded) { // 表单提交只能使用一个类型
          throw methodError(method, "Only one encoding annotation is allowed.");
        isMultipart = true;
      } else if (annotation instanceof FormUrlEncoded) { // 表单提交
        if (isMultipart) { // 表单提交只能使用一个类型
          throw methodError(method, "Only one encoding annotation is allowed.");
        isFormEncoded = true;
    }

parseHttpMethodAndPath(“DELETE”, ((DELETE) annotation).value(), false); 等 一系列方法解析

private void parseHttpMethodAndPath(String httpMethod, String value, boolean hasBody) {
      if (this.httpMethod != null) {
        throw methodError(method, "Only one HTTP method is allowed. Found: %s and %s.",
            this.httpMethod, httpMethod);
      this.httpMethod = httpMethod;
      this.hasBody = hasBody;
      if (value.isEmpty()) { // 内容为空 则返回
        return;
      // Get the relative URL path and existing query string, if present.
      int question = value.indexOf('?'); // 判断value中是否存在?字符
      if (question != -1 && question < value.length() - 1) { // !=-1 表示value中有
        // Ensure the query string does not have any named parameters.
        // eg: app/watch/list?userid=123456  下面代码拿取数据得到 userid=123456
        String queryParams = value.substring(question + 1); 
        // PARAM_URL_REGEX = Pattern.compile("\\{(" + PARAM + ")\\}");
        // queryParams是否有进行匹配的字符 eg userid={$userid}
        Matcher queryParamMatcher = PARAM_URL_REGEX.matcher(queryParams);
        if (queryParamMatcher.find()) { // 如果存在 即抛出异常,这个需要使用@Query注解写到参数中
          throw methodError(method, "URL query string \"%s\" must not have replace block. "
              + "For dynamic query parameters use @Query.", queryParams);
      this.relativeUrl = value;
      this.relativeUrlParamNames = parsePathParameters(value); // 解析方法中路径字符,并将符合条件的String字符进行返回
    }

parsePathParameters(value);

static Set<String> parsePathParameters(String path) {
      // PARAM_URL_REGEX = Pattern.compile("\\{(" + PARAM + ")\\}");
      // path是否有进行匹配的字符 eg /api/watch/account/update/{id}
      Matcher m = PARAM_URL_REGEX.matcher(path);
      Set<String> patterns = new LinkedHashSet<>();
      while (m.find()) { // 得到匹配是有的,
        patterns.add(m.group(1)); // 将匹配到的字符串添加到Set集合中, Set集合特点,不能重复
      return patterns;
    }

如果是HTTP注解

@Documented
  @Target(METHOD)
  @Retention(RUNTIME)
  public @interface HTTP {
    String method();
     * A relative or absolute path, or full URL of the endpoint. This value is optional if the first
     * parameter of the method is annotated with {@link Url @Url}.
     * See {@linkplain retrofit2.Retrofit.Builder#baseUrl(HttpUrl) base URL} for details of how
     * this is resolved against a base URL to create the full endpoint URL.
    String path() default "";
    boolean hasBody() default false; // 默认的hasBody 为false
  }

parseHeaders(headersToParse);
例如下面代码中的添加 headers 请求头信息

public interface UserService {  
    @Headers({
        "Accept: application/vnd.yourapi.v1.full+json",
        "User-Agent: Your-App-Name"
    @GET("/app/{userid}")
    Call<UserInfo> getUserInfo(@Path("userid") long userid);
private Headers parseHeaders(String[] headers) {
      Headers.Builder builder = new Headers.Builder();
      for (String header : headers) { // 遍历所有的header
        int colon = header.indexOf(':'); // 获取当前header中:字符所在的下标值
        if (colon == -1 || colon == 0 || colon == header.length() - 1) { // 出现这些情况表示没有出现:字符 抛出异常
          throw methodError(method,
              "@Headers value must be in the form \"Name: Value\". Found: \"%s\"", header);
        String headerName = header.substring(0, colon); // 请求头名称
        String headerValue = header.substring(colon + 1).trim(); // 请求头的内容
        if ("Content-Type".equalsIgnoreCase(headerName)) { // 如果请求头为Content-Type需要进行特殊处理 
          try {
            contentType = MediaType.get(headerValue); // 请求类型的设置
          } catch (IllegalArgumentException e) {
            throw methodError(method, e, "Malformed content type: %s", headerValue);
        } else {
          builder.add(headerName, headerValue); // 主要添加到namesAndValues集合中
      return builder.build();
    }

builder.build();

public Headers build() {
      return new Headers(this); // 实例化了一个Header对象
    }

将builder中得到的 namesAndValues 集合赋值给Header的成员变量

Headers(Builder builder) {
    this.namesAndValues = builder.namesAndValues.toArray(new String[builder.namesAndValues.size()]);
  }

上面的代码是对作用于方法上的注解进行解析的,下面我们来看一下作用于方法参数的注解进行解析。
parseParameter(p, parameterTypes[p], parameterAnnotationsArray[p]);

// p 当前方法的参数下标
    // parameterType 当前方法的参数类型
    // annotations 当前方法的参数注解
    private ParameterHandler<?> parseParameter(
        int p, Type parameterType, @Nullable Annotation[] annotations) {
      ParameterHandler<?> result = null;
      if (annotations != null) {
        for (Annotation annotation : annotations) {
          ParameterHandler<?> annotationAction =
              parseParameterAnnotation(p, parameterType, annotations, annotation);
          if (annotationAction == null) {
            continue;
          if (result != null) { // 出现多个Retrofit的注解,只能使用一个
            throw parameterError(method, p,
                "Multiple Retrofit annotations found, only one allowed.");
          result = annotationAction;
      if (result == null) { // 没有找到Retrofit相对应的注解
        throw parameterError(method, p, "No Retrofit annotation found.");
      return result;
    }

parseParameterAnnotation(p, parameterType, annotations, annotation); 开始解析
下面的代码有点长

@Nullable
    private ParameterHandler<?> parseParameterAnnotation(
        int p, Type type, Annotation[] annotations, Annotation annotation) {
      if (annotation instanceof Url) {
        validateResolvableType(p, type); // 如果方法的返回结果包含了泛型表达式、泛型、泛型数组,就抛出异常
        if (gotUrl) { // 如果出现两次@Url注解 抛出异常
          throw parameterError(method, p, "Multiple @Url method annotations found.");
        if (gotPath) { // @Path 与 @Url 不能同时使用  否则抛出异常
          throw parameterError(method, p, "@Path parameters may not be used with @Url.");
        if (gotQuery) { // @Url参数不能出现在@Query之后。
          throw parameterError(method, p, "A @Url parameter must not come after a @Query.");
        if (gotQueryName) { // @Url参数不能出现在@QueryName之后。
          throw parameterError(method, p, "A @Url parameter must not come after a @QueryName.");
        if (gotQueryMap) { // @Url参数不能出现在@QueryMap之后。
          throw parameterError(method, p, "A @Url parameter must not come after a @QueryMap.");
        if (relativeUrl != null) { // @Url 不能与httpMethod里面注解一起使用 具体见下面判断代码
          throw parameterError(method, p, "@Url cannot be used with @%s URL", httpMethod);
        gotUrl = true; // 获取Url成功
        if (type == HttpUrl.class
            || type == String.class
            || type == URI.class
            || (type instanceof Class && "android.net.Uri".equals(((Class<?>) type).getName()))) {
          return new ParameterHandler.RelativeUrl(); // 对relativeUrl赋值处理
        } else {
          throw parameterError(method, p,
              "@Url must be okhttp3.HttpUrl, String, java.net.URI, or android.net.Uri type.");
      } else if (annotation instanceof Path) {
        validateResolvableType(p, type); // 如果方法的返回结果包含了泛型表达式、泛型、泛型数组,就抛出异常
        if (gotQuery) { // @Path必须在@Query注解之前使用
          throw parameterError(method, p, "A @Path parameter must not come after a @Query.");
        if (gotQueryName) { // @Path必须在@QueryName注解之前使用
          throw parameterError(method, p, "A @Path parameter must not come after a @QueryName.");
        if (gotQueryMap) { // @Path必须在@QueryMap注解之前使用
          throw parameterError(method, p, "A @Path parameter must not come after a @QueryMap.");
        if (gotUrl) { // @Path不能与@Url同时使用
          throw parameterError(method, p, "@Path parameters may not be used with @Url.");
        if (relativeUrl == null) { // @Path必须在与类型是HttpUrl/String/Uri/android.net.Uri一起使用
          throw parameterError(method, p, "@Path can only be used with relative url on @%s",
              httpMethod);
        gotPath = true; // 获取到Path成功
        Path path = (Path) annotation; // path的注解
        String name = path.value(); // path注解的value值
        validatePathName(p, name);// 对注解和value进行验证 查看relativeUrlParamNames是否包含当前注解信息 如果没有就抛出异常
        Converter<?, String> converter = retrofit.stringConverter(type, annotations); // 将转换器工厂替换成String
        // 注解的value值 转换器String 路径编码(未设置默认为false)
        return new ParameterHandler.Path<>(name, converter, path.encoded()); // 创建path对象
      } else if (annotation instanceof Query) { // 当前参数注解类型为 @Query
        validateResolvableType(p, type); // 如果方法的返回结果包含了泛型表达式、泛型、泛型数组,就抛出异常
        Query query = (Query) annotation;
        String name = query.value();
        boolean encoded = query.encoded();
        Class<?> rawParameterType = Utils.getRawType(type); // 判断当前参数是什么具体类型的
        gotQuery = true;
        // isAssignableFrom 集合类型 父类 对 子类进行判断是否是属于同一类的
        // instanceof 子类 对 父类 进行判断是否属于同一类
        if (Iterable.class.isAssignableFrom(rawParameterType)) { // eg : List、Collection等 返回true
          if (!(type instanceof ParameterizedType)) { // type 类型不是参数化类型 抛出异常 参数异常
            throw parameterError(method, p, rawParameterType.getSimpleName()
                + " must include generic type (e.g., "
                + rawParameterType.getSimpleName()
                + "<String>)");
          ParameterizedType parameterizedType = (ParameterizedType) type;
          // 如果内部是属于通配符类型 获取通配符表达式对象的泛型限定的上边界的类型 List<? extends Number> 获取 Number
          Type iterableType = Utils.getParameterUpperBound(0, parameterizedType);
          Converter<?, String> converter =
              retrofit.stringConverter(iterableType, annotations); // 将转换器工厂替换成String
          return new ParameterHandler.Query<>(name, converter, encoded).iterable(); // 创建参数Query实例
        } else if (rawParameterType.isArray()) { // [] 数组类型 Array.newInstance().getClass(); 进行返回 的处理
          // 如果是基础类型的数组类型 则返回基础类型的class对象 例如 if (boolean.class == type) return Boolean.class; 其他情况直接返回type
          Class<?> arrayComponentType = boxIfPrimitive(rawParameterType.getComponentType());
          Converter<?, String> converter =
              retrofit.stringConverter(arrayComponentType, annotations); // 将转换器工厂替换成String
          return new ParameterHandler.Query<>(name, converter, encoded).array(); // 创建参数Query实例
        } else { // 其他情况 直接Class对象 或者 类型变量 String T 等
          Converter<?, String> converter =
              retrofit.stringConverter(type, annotations); // 将转换器工厂替换成String
          return new ParameterHandler.Query<>(name, converter, encoded); // 创建参数Query实例
      } else if (annotation instanceof QueryName) { // 当前参数类型注解为 @QueryName
        validateResolvableType(p, type); // 如果方法的返回结果包含了泛型表达式、泛型、泛型数组,就抛出异常
        QueryName query = (QueryName) annotation;
        boolean encoded = query.encoded();
        Class<?> rawParameterType = Utils.getRawType(type); // 判断当前参数是什么具体类型的
        gotQueryName = true;
        // isAssignableFrom 集合类型 父类 对 子类进行判断是否是属于同一类的
        // instanceof 子类 对 父类 进行判断是否属于同一类
        if (Iterable.class.isAssignableFrom(rawParameterType)) { // 集合类型
          if (!(type instanceof ParameterizedType)) { // type 类型不是参数化类型 抛出参数化异常
            throw parameterError(method, p, rawParameterType.getSimpleName()
                + " must include generic type (e.g., "
                + rawParameterType.getSimpleName()
                + "<String>)");
          ParameterizedType parameterizedType = (ParameterizedType) type;
          Type iterableType = Utils.getParameterUpperBound(0, parameterizedType); // 拿到实际数据类型 通配符类型向上取对象
          Converter<?, String> converter =
              retrofit.stringConverter(iterableType, annotations); // 将转换器工厂替换成String
          return new ParameterHandler.QueryName<>(converter, encoded).iterable(); // 实例化QueryName对象
        } else if (rawParameterType.isArray()) { // 数组类型
          Class<?> arrayComponentType = boxIfPrimitive(rawParameterType.getComponentType()); // 八大基础类型则返回基础类型对应对象class 其他直接返回传入类型
          Converter<?, String> converter =
              retrofit.stringConverter(arrayComponentType, annotations); // 将转换器工厂替换成String
          return new ParameterHandler.QueryName<>(converter, encoded).array(); // 实例化QueryName对象
        } else { // 其他情况
          Converter<?, String> converter =
              retrofit.stringConverter(type, annotations); // 将转换器工厂替换成String
          return new ParameterHandler.QueryName<>(converter, encoded); // 实例化QueryName对象
      } else if (annotation instanceof QueryMap) { // 当前参数类型注解为 #@QueryMap
        validateResolvableType(p, type); // 如果方法的返回结果包含了泛型表达式、泛型、泛型数组,就抛出异常
        Class<?> rawParameterType = Utils.getRawType(type); // 判断当前参数是什么具体类型的
        gotQueryMap = true;
        // isAssignableFrom 集合类型 父类 对 子类进行判断是否是属于同一类的
        // instanceof 子类 对 父类 进行判断是否属于同一类
        if (!Map.class.isAssignableFrom(rawParameterType)) { // 传入参数非Map类型 抛出参数异常 必须传入Map
          throw parameterError(method, p, "@QueryMap parameter type must be Map.");
        Type mapType = Utils.getSupertype(type, rawParameterType, Map.class); // 当前参数的类型超类获取
        if (!(mapType instanceof ParameterizedType)) { // 非参数化类型 抛出参数错误
          throw parameterError(method, p,
              "Map must include generic types (e.g., Map<String, String>)");
        ParameterizedType parameterizedType = (ParameterizedType) mapType;
        Type keyType = Utils.getParameterUpperBound(0, parameterizedType); // 获取当前Map中key的具体类型值
        if (String.class != keyType) {
          throw parameterError(method, p, "@QueryMap keys must be of type String: " + keyType);
        Type valueType = Utils.getParameterUpperBound(1, parameterizedType); // 获取当前Map中value的具体类型值
        Converter<?, String> valueConverter =
            retrofit.stringConverter(valueType, annotations); // 将转换器工厂替换成String
        return new ParameterHandler.QueryMap<>(valueConverter, ((QueryMap) annotation).encoded()); // 实例化QueryMap对象
      } else if (annotation instanceof Header) {// 当前参数注解为 @Header
        validateResolvableType(p, type); // 如果方法的返回结果包含了泛型表达式、泛型、泛型数组,就抛出异常
        Header header = (Header) annotation;
        String name = header.value();
        Class<?> rawParameterType = Utils.getRawType(type); // 判断当前参数是什么具体类型的
        // isAssignableFrom 集合类型 父类 对 子类进行判断是否是属于同一类的
        // instanceof 子类 对 父类 进行判断是否属于同一类
        if (Iterable.class.isAssignableFrom(rawParameterType)) { // 集合类型
          if (!(type instanceof ParameterizedType)) {
            throw parameterError(method, p, rawParameterType.getSimpleName()
                + " must include generic type (e.g., "
                + rawParameterType.getSimpleName()
                + "<String>)");
          ParameterizedType parameterizedType = (ParameterizedType) type;
          Type iterableType = Utils.getParameterUpperBound(0, parameterizedType);// 获取当前参数类型
          Converter<?, String> converter =
              retrofit.stringConverter(iterableType, annotations); // 将转换器工厂替换成String
          return new ParameterHandler.Header<>(name, converter).iterable();
        } else if (rawParameterType.isArray()) {// 数组类型
          Class<?> arrayComponentType = boxIfPrimitive(rawParameterType.getComponentType()); // 获取当前参数承载类对象
          Converter<?, String> converter =
              retrofit.stringConverter(arrayComponentType, annotations); // 将转换器工厂替换成String
          return new ParameterHandler.Header<>(name, converter).array(); // 实例化Header对象
        } else { // 其他情况
          Converter<?, String> converter =
              retrofit.stringConverter(type, annotations); // 将转换器工厂替换成String
          return new ParameterHandler.Header<>(name, converter); // 实例化Header对象
      } else if (annotation instanceof HeaderMap) { // 当前参数注解为 @HeaderMap
        validateResolvableType(p, type); // 如果方法的返回结果包含了泛型表达式、泛型、泛型数组,就抛出异常
        Class<?> rawParameterType = Utils.getRawType(type); // 判断当前参数是什么具体类型的
        // isAssignableFrom 集合类型 父类 对 子类进行判断是否是属于同一类的
        // instanceof 子类 对 父类 进行判断是否属于同一类
        if (!Map.class.isAssignableFrom(rawParameterType)) { //非Map类
          throw parameterError(method, p, "@HeaderMap parameter type must be Map.");
        Type mapType = Utils.getSupertype(type, rawParameterType, Map.class);
        if (!(mapType instanceof ParameterizedType)) { // 非参数化类型
          throw parameterError(method, p,
              "Map must include generic types (e.g., Map<String, String>)");
        ParameterizedType parameterizedType = (ParameterizedType) mapType;
        Type keyType = Utils.getParameterUpperBound(0, parameterizedType); // 获取key对应的数据类型类
        if (String.class != keyType) {
          throw parameterError(method, p, "@HeaderMap keys must be of type String: " + keyType);
        Type valueType = Utils.getParameterUpperBound(1, parameterizedType); // 获取value对应的数据类型类
        Converter<?, String> valueConverter =
            retrofit.stringConverter(valueType, annotations); // 将转换器工厂替换成String
        return new ParameterHandler.HeaderMap<>(valueConverter); // 实例HeaderMap对象
      } else if (annotation instanceof Field) { // 当前参数注解为 @Field
        validateResolvableType(p, type); // 如果方法的返回结果包含了泛型表达式、泛型、泛型数组,就抛出异常
        if (!isFormEncoded) { // 非表单提交 不能使用
          throw parameterError(method, p, "@Field parameters can only be used with form encoding.");
        Field field = (Field) annotation;
        String name = field.value();
        boolean encoded = field.encoded();
        gotField = true; // 有表单提交
        Class<?> rawParameterType = Utils.getRawType(type); // 判断当前参数是什么具体类型的
        // isAssignableFrom 集合类型 父类 对 子类进行判断是否是属于同一类的
        // instanceof 子类 对 父类 进行判断是否属于同一类
        if (Iterable.class.isAssignableFrom(rawParameterType)) {// 集合类型
          if (!(type instanceof ParameterizedType)) {
            throw parameterError(method, p, rawParameterType.getSimpleName()
                + " must include generic type (e.g., "
                + rawParameterType.getSimpleName()
                + "<String>)");
          ParameterizedType parameterizedType = (ParameterizedType) type;
          Type iterableType = Utils.getParameterUpperBound(0, parameterizedType); // 获取集合类型对应的具体类
          Converter<?, String> converter =
              retrofit.stringConverter(iterableType, annotations); // 将转换器工厂替换成String
          return new ParameterHandler.Field<>(name, converter, encoded).iterable(); // 实例化Field对象
        } else if (rawParameterType.isArray()) { // 数组类型
          Class<?> arrayComponentType = boxIfPrimitive(rawParameterType.getComponentType()); // 获取数组类型的具体类
          Converter<?, String> converter =
              retrofit.stringConverter(arrayComponentType, annotations); // 将转换器工厂替换成String
          return new ParameterHandler.Field<>(name, converter, encoded).array(); // 实例化Field对象
        } else { // 其他情况
          Converter<?, String> converter =
              retrofit.stringConverter(type, annotations); // 将转换器工厂替换成String
          return new ParameterHandler.Field<>(name, converter, encoded); // 实例化Field对象
      } else if (annotation instanceof FieldMap) { // 当前参数注解为 @FieldMap
        validateResolvableType(p, type); // 如果方法的返回结果包含了泛型表达式、泛型、泛型数组,就抛出异常
        if (!isFormEncoded) { // 非表单请求
          throw parameterError(method, p,
              "@FieldMap parameters can only be used with form encoding.");
        Class<?> rawParameterType = Utils.getRawType(type); // 判断当前参数是什么具体类型的
        // isAssignableFrom 集合类型 父类 对 子类进行判断是否是属于同一类的
        // instanceof 子类 对 父类 进行判断是否属于同一类
        if (!Map.class.isAssignableFrom(rawParameterType)) { // 非Map类型
          throw parameterError(method, p, "@FieldMap parameter type must be Map.");
        Type mapType = Utils.getSupertype(type, rawParameterType, Map.class); // 当前类的超类类型获取
        if (!(mapType instanceof ParameterizedType)) { // 非参数化类型
          throw parameterError(method, p,
              "Map must include generic types (e.g., Map<String, String>)");
        ParameterizedType parameterizedType = (ParameterizedType) mapType;
        Type keyType = Utils.getParameterUpperBound(0, parameterizedType); // 获取参数Key具体类型类
        if (String.class != keyType) {
          throw parameterError(method, p, "@FieldMap keys must be of type String: " + keyType);
        Type valueType = Utils.getParameterUpperBound(1, parameterizedType); // 获取参数value具体类型类
        Converter<?, String> valueConverter =
            retrofit.stringConverter(valueType, annotations); // 将转换器工厂替换成String
        gotField = true; // 有表单提交
        return new ParameterHandler.FieldMap<>(valueConverter, ((FieldMap) annotation).encoded());//实例化FieldMap对象
      } else if (annotation instanceof Part) { //当前参数注解为 @Part
        validateResolvableType(p, type); // 如果方法的返回结果包含了泛型表达式、泛型、泛型数组,就抛出异常
        if (!isMultipart) { // 非表单提交(带有文件)
          throw parameterError(method, p,
              "@Part parameters can only be used with multipart encoding.");
        Part part = (Part) annotation;
        gotPart = true; // 有part提交
        String partName = part.value();
        Class<?> rawParameterType = Utils.getRawType(type); // 判断当前参数是什么具体类型的
        if (partName.isEmpty()) { // value值为空
        // isAssignableFrom 集合类型 父类 对 子类进行判断是否是属于同一类的
        // instanceof 子类 对 父类 进行判断是否属于同一类
          if (Iterable.class.isAssignableFrom(rawParameterType)) { // 集合类型
            if (!(type instanceof ParameterizedType)) {
              throw parameterError(method, p, rawParameterType.getSimpleName()
                  + " must include generic type (e.g., "
                  + rawParameterType.getSimpleName()
                  + "<String>)");
            ParameterizedType parameterizedType = (ParameterizedType) type;
            Type iterableType = Utils.getParameterUpperBound(0, parameterizedType);// 集合类型具体类型类
            // isAssignableFrom 集合类型 父类 对 子类进行判断是否是属于同一类的
            // instanceof 子类 对 父类 进行判断是否属于同一类
            if (!MultipartBody.Part.class.isAssignableFrom(Utils.getRawType(iterableType))) {  // 判断当前参数是什么具体类型的
              throw parameterError(method, p,
                  "@Part annotation must supply a name or use MultipartBody.Part parameter type.");
            // multipartBuilder.addPart(part);
            return ParameterHandler.RawPart.INSTANCE.iterable(); // 实例化Part对象 将value值遍历添加到Part中
          } else if (rawParameterType.isArray()) { // 数组类型
            Class<?> arrayComponentType = rawParameterType.getComponentType(); // 获取数组具体类型 String[] 拿到之后 String
            // isAssignableFrom 集合类型 父类 对 子类进行判断是否是属于同一类的
            // instanceof 子类 对 父类 进行判断是否属于同一类
            if (!MultipartBody.Part.class.isAssignableFrom(arrayComponentType)) {
              throw parameterError(method, p,
                  "@Part annotation must supply a name or use MultipartBody.Part parameter type.");
            return ParameterHandler.RawPart.INSTANCE.array(); // 实例化Part对象 将value值遍历添加到Part中
            // isAssignableFrom 集合类型 父类 对 子类进行判断是否是属于同一类的
            // instanceof 子类 对 父类 进行判断是否属于同一类
          } else if (MultipartBody.Part.class.isAssignableFrom(rawParameterType)) {
            return ParameterHandler.RawPart.INSTANCE; // 实例化RawPart对象
          } else {// 其他情况
            throw parameterError(method, p,
                "@Part annotation must supply a name or use MultipartBody.Part parameter type.");
        } else { // value不为空
          Headers headers =
              Headers.of("Content-Disposition", "form-data; name=\"" + partName + "\"",
                  "Content-Transfer-Encoding", part.encoding()); // 补充请求头文件信息
          // isAssignableFrom 集合类型 父类 对 子类进行判断是否是属于同一类的
          // instanceof 子类 对 父类 进行判断是否属于同一类
          if (Iterable.class.isAssignableFrom(rawParameterType)) { // 集合类型
            if (!(type instanceof ParameterizedType)) { // 非参数化类型
              throw parameterError(method, p, rawParameterType.getSimpleName()
                  + " must include generic type (e.g., "
                  + rawParameterType.getSimpleName()
                  + "<String>)");
            ParameterizedType parameterizedType = (ParameterizedType) type;
            Type iterableType = Utils.getParameterUpperBound(0, parameterizedType); // 获取当前集合类型的具体类型
            // isAssignableFrom 集合类型 父类 对 子类进行判断是否是属于同一类的
            // instanceof 子类 对 父类 进行判断是否属于同一类
            if (MultipartBody.Part.class.isAssignableFrom(Utils.getRawType(iterableType))) {  // 判断当前参数是什么具体类型的
              throw parameterError(method, p,
                  "@Part parameters using the MultipartBody.Part must not "
                      + "include a part name in the annotation.");
            Converter<?, RequestBody> converter =
                retrofit.requestBodyConverter(iterableType, annotations, methodAnnotations);
            return new ParameterHandler.Part<>(headers, converter).iterable();
          } else if (rawParameterType.isArray()) {
            Class<?> arrayComponentType = boxIfPrimitive(rawParameterType.getComponentType());
            // isAssignableFrom 集合类型 父类 对 子类进行判断是否是属于同一类的
            // instanceof 子类 对 父类 进行判断是否属于同一类
            if (MultipartBody.Part.class.isAssignableFrom(arrayComponentType)) {
              throw parameterError(method, p,
                  "@Part parameters using the MultipartBody.Part must not "
                      + "include a part name in the annotation.");
            // 转换器进行处理
            Converter<?, RequestBody> converter =
                retrofit.requestBodyConverter(arrayComponentType, annotations, methodAnnotations);
            return new ParameterHandler.Part<>(headers, converter).array();//实例化Part对象
          // isAssignableFrom 集合类型 父类 对 子类进行判断是否是属于同一类的
          // instanceof 子类 对 父类 进行判断是否属于同一类
          } else if (MultipartBody.Part.class.isAssignableFrom(rawParameterType)) {
            throw parameterError(method, p,
                "@Part parameters using the MultipartBody.Part must not "
                    + "include a part name in the annotation.");
          } else {
            // 转换器进行处理
            Converter<?, RequestBody> converter =
                retrofit.requestBodyConverter(type, annotations, methodAnnotations);
            return new ParameterHandler.Part<>(headers, converter);//实例化Part对象
      } else if (annotation instanceof PartMap) { // 当前参数注解为 @PartMap
        validateResolvableType(p, type); // 如果方法的返回结果包含了泛型表达式、泛型、泛型数组,就抛出异常
        if (!isMultipart) { // 非表单提交(含有文件提交)
          throw parameterError(method, p,
              "@PartMap parameters can only be used with multipart encoding.");
        gotPart = true;
        Class<?> rawParameterType = Utils.getRawType(type); // 判断当前参数是什么具体类型的
        // isAssignableFrom 集合类型 父类 对 子类进行判断是否是属于同一类的
        // instanceof 子类 对 父类 进行判断是否属于同一类
        if (!Map.class.isAssignableFrom(rawParameterType)) {
          throw parameterError(method, p, "@PartMap parameter type must be Map.");
        Type mapType = Utils.getSupertype(type, rawParameterType, Map.class); // 获取超类类型
        if (!(mapType instanceof ParameterizedType)) {
          throw parameterError(method, p,
              "Map must include generic types (e.g., Map<String, String>)");
        ParameterizedType parameterizedType = (ParameterizedType) mapType;
        Type keyType = Utils.getParameterUpperBound(0, parameterizedType); // 获取参数map中key的具体类型类
        if (String.class != keyType) {
          throw parameterError(method, p, "@PartMap keys must be of type String: " + keyType);
        Type valueType = Utils.getParameterUpperBound(1, parameterizedType); // 获取参数map中value的具体类型类
        // isAssignableFrom 集合类型 父类 对 子类进行判断是否是属于同一类的
        // instanceof 子类 对 父类 进行判断是否属于同一类
        if (MultipartBody.Part.class.isAssignableFrom(Utils.getRawType(valueType))) { // 判断当前参数是什么具体类型的
          throw parameterError(method, p, "@PartMap values cannot be MultipartBody.Part. "
              + "Use @Part List<Part> or a different value type instead.");
        // 转换器进行处理
        Converter<?, RequestBody> valueConverter =
            retrofit.requestBodyConverter(valueType, annotations, methodAnnotations);
        PartMap partMap = (PartMap) annotation;
        return new ParameterHandler.PartMap<>(valueConverter, partMap.encoding()); // 实例化PartMap对象
      } else if (annotation instanceof Body) { // 当前参数注解为 @Body
        validateResolvableType(p, type); // 如果方法的返回结果包含了泛型表达式、泛型、泛型数组,就抛出异常
        if (isFormEncoded || isMultipart) { // @Body注解不能与表单提交一起使用
          throw parameterError(method, p,
              "@Body parameters cannot be used with form or multi-part encoding.");
        if (gotBody) { // 不能使用多个@Body注解
          throw parameterError(method, p, "Multiple @Body method annotations found.");
        Converter<?, RequestBody> converter;
        try {
          // 转换器进行处理
          converter = retrofit.requestBodyConverter(type, annotations, methodAnnotations);
        } catch (RuntimeException e) {
          // Wide exception range because factories are user code.
          throw parameterError(method, e, p, "Unable to create @Body converter for %s", type);
        gotBody = true;
        return new ParameterHandler.Body<>(converter); // 实例化Body对象
      return null; // Not a Retrofit annotation.
    }

Class<?> rawParameterType = Utils.getRawType(type); 获取当前方法参数的具体类型

static Class<?> getRawType(Type type) {
    checkNotNull(type, "type == null"); // 判空处理
    if (type instanceof Class<?>) { // 如果是正常类参数 直接返回 例: String 直接返回
      // Type is a normal class.
      return (Class<?>) type;
    if (type instanceof ParameterizedType) { // 判断是否属于泛型参数 例: List<String> : true  List:false
      ParameterizedType parameterizedType = (ParameterizedType) type;
      Type rawType = parameterizedType.getRawType(); // 获取泛型参数的类或者接口类型 eg:List<String>  返回 List
      if (!(rawType instanceof Class)) throw new IllegalArgumentException(); // 如果返回的类不是正常类 抛出异常
      return (Class<?>) rawType; // 返回当前类型 List
    if (type instanceof GenericArrayType) { // 判断是否是通用数据类型
      // 无论从左向右有几个[]并列,这个方法仅仅脱去最右边的[]之后剩下的内容就作为这个方法的返回值。
      Type componentType = ((GenericArrayType) type).getGenericComponentType();
      return Array.newInstance(getRawType(componentType), 0).getClass(); // 由于是数组,拿取第一个位置就能知道是什么类
    if (type instanceof TypeVariable) { // 可变类型
      return Object.class;
    if (type instanceof WildcardType) { // 通配符类型 ?,? extends Number,? super Number
      return getRawType(((WildcardType) type).getUpperBounds()[0]); // 获取通配符表达式对象的泛型限定的上边界的类型
    // 上面类型都没有 则抛出异常
    throw new IllegalArgumentException("Expected a Class, ParameterizedType, or "
          + "GenericArrayType, but <" + type + "> is of type " + type.getClass().getName());
  }

new RequestFactory(this);

RequestFactory(Builder builder) { // 根据之前的相关注解的解析 实例化请求工厂类
    method = builder.method; // 方法
    baseUrl = builder.retrofit.baseUrl; // 请求头 url
    httpMethod = builder.httpMethod; // 请求方法 例如: get
    relativeUrl = builder.relativeUrl; // 请求路径url
    headers = builder.headers; // 请求头数据
    contentType = builder.contentType; // 内容类型
    hasBody = builder.hasBody; // 是否有请求体
    isFormEncoded = builder.isFormEncoded; // 是否是表单提交
    isMultipart = builder.isMultipart; // 是否是表单提交(含有文件)
    parameterHandlers = builder.parameterHandlers; //所有参数数据
  }

ServiceMethod 中调用 new HttpServiceMethod<>(requestFactory, callFactory, callAdapter, responseConverter);

static <ResponseT, ReturnT> HttpServiceMethod<ResponseT, ReturnT> parseAnnotations(
      Retrofit retrofit, Method method, RequestFactory requestFactory) {
    // 根据当前方法的返回参数创建请求适配器
    CallAdapter<ResponseT, ReturnT> callAdapter = createCallAdapter(retrofit, method);
    Type responseType = callAdapter.responseType(); // 获取响应数据类型 
    if (responseType == Response.class || responseType == okhttp3.Response.class) { // 不能是Response类
      throw methodError(method, "'"
          + Utils.getRawType(responseType).getName()
          + "' is not a valid response body type. Did you mean ResponseBody?");
    // 请求方法是请求头 并且方法返回不为Void
    if (requestFactory.httpMethod.equals("HEAD") && !Void.class.equals(responseType)) {
      throw methodError(method, "HEAD method must use Void as response type.");
    // 创建响应转换器 根据响应类型创建转换器
    Converter<ResponseBody, ResponseT> responseConverter =
        createResponseConverter(retrofit, method, responseType);
    okhttp3.Call.Factory callFactory = retrofit.callFactory; // callFactory 就是开始初始化的 OkHttpClient
    // 根据上面得到的信息进行实例化 HttpServiceMethod对象
    return new HttpServiceMethod<>(requestFactory, callFactory, callAdapter, responseConverter);
  }

createCallAdapter()

private static <ResponseT, ReturnT> CallAdapter<ResponseT, ReturnT> createCallAdapter(
      Retrofit retrofit, Method method) {
    Type returnType = method.getGenericReturnType(); // 获取方法的返回类型
    Annotation[] annotations = method.getAnnotations(); // 获取作用于方法上面的所有注解
    try {
      //noinspection unchecked 获取请求适配器
      return (CallAdapter<ResponseT, ReturnT>) retrofit.callAdapter(returnType, annotations);
    } catch (RuntimeException e) { // Wide exception range because factories are user code.
      throw methodError(method, e, "Unable to create call adapter for %s", returnType);
  }

Retrofit # callAdapter(returnType, annotations);

public CallAdapter<?, ?> callAdapter(Type returnType, Annotation[] annotations) {
    return nextCallAdapter(null, returnType, annotations);
  public CallAdapter<?, ?> nextCallAdapter(@Nullable CallAdapter.Factory skipPast, Type returnType,
      Annotation[] annotations) {
    checkNotNull(returnType, "returnType == null"); // 判空处理
    checkNotNull(annotations, "annotations == null"); // 判空处理
    // call适配器工厂的第二个开始 根据上面的源码可以知道 
    //         第一个是我自己添加的 RxJava2CallAdapterFactory
    //         第二个是系统自己默认的 platform.defaultCallAdapterFactories(callbackExecutor) 通过handler会在主线程进行执行
    //         callbackExecutor == null ? ExecutorCallAdapterFactory : DefaultCallAdapterFactory
    int start = callAdapterFactories.indexOf(skipPast) + 1; // 从 0 开始 获取
    for (int i = start, count = callAdapterFactories.size(); i < count; i++) {
      CallAdapter<?, ?> adapter = callAdapterFactories.get(i).get(returnType, annotations, this);
      if (adapter != null) {
        return adapter;
    // 没有获取到直接抛出异常
    StringBuilder builder = new StringBuilder("Could not locate call adapter for ")
        .append(returnType)
        .append(".\n");
    if (skipPast != null) {
      builder.append("  Skipped:");
      for (int i = 0; i < start; i++) {
        builder.append("\n   * ").append(callAdapterFactories.get(i).getClass().getName());
      builder.append('\n');
    builder.append("  Tried:");
    for (int i = start, count = callAdapterFactories.size(); i < count; i++) {
      builder.append("\n   * ").append(callAdapterFactories.get(i).getClass().getName());
    throw new IllegalArgumentException(builder.toString());
  }

创建响应转换器

Retrofit # responseBodyConverter()

public <T> Converter<ResponseBody, T> responseBodyConverter(Type type, Annotation[] annotations) {
    return nextResponseBodyConverter(null, type, annotations);
  public <T> Converter<ResponseBody, T> nextResponseBodyConverter(
      @Nullable Converter.Factory skipPast, Type type, Annotation[] annotations) {
    checkNotNull(type, "type == null"); // 判空处理
    checkNotNull(annotations, "annotations == null"); // 判空处理
    int start = converterFactories.indexOf(skipPast) + 1; // 从转换器的第一个开始获取
    for (int i = start, count = converterFactories.size(); i < count; i++) {
            converterFactories.add(new BuiltInConverters()); 0
            converterFactories.addAll(this.converterFactories); 1 WGsonConverterFactory 初始化的时候添加的Gson转换器工厂
            converterFactories.addAll(platform.defaultConverterFactories()); 2 系统默认的转换器工厂 >= 7.0 返回为1 其他 null
            // 初始化添加的 获取默认就初始化 一定不为空
            如果大于等于7.0 就是这个工厂 OptionalConverterFactory 进行实例化
      Converter<ResponseBody, ?> converter =
          converterFactories.get(i).responseBodyConverter(type, annotations, this);
      if (converter != null) {
        //noinspection unchecked
        return (Converter<ResponseBody, T>) converter;
    // 拿取失败就抛出异常
    StringBuilder builder = new StringBuilder("Could not locate ResponseBody converter for ")
        .append(type)
        .append(".\n");
    if (skipPast != null) {
      builder.append("  Skipped:");
      for (int i = 0; i < start; i++) {
        builder.append("\n   * ").append(converterFactories.get(i).getClass().getName());
      builder.append('\n');
    builder.append("  Tried:");
    for (int i = start, count = converterFactories.size(); i < count; i++) {
      builder.append("\n   * ").append(converterFactories.get(i).getClass().getName());
    throw new IllegalArgumentException(builder.toString());
  }

到这里表示就上面的代码已经将所有的方法相关的数据进行解析了,数据值也进行了缓存,下面可以开始去做请求操作了。开始执行invoke的操作,下面我们看一下invoke里面具体做了什么操作。

loadServiceMethod(method).invoke(args != null ? args : emptyArgs);

ServiceMethod # invoke() 方法仅在 HttpServiceMethod 类中进行实现,所以
HttpServiceMethod # invoke()

@Override ReturnT invoke(Object[] args) {
    return callAdapter.adapt(
        new OkHttpCall<>(requestFactory, args, callFactory, responseConverter));
  }

先看方法里面,创建了一个 OkHttpCall 的实例, OkHttpCall implements Call OkHttpCall 实现了Call的接口,这个Call是 Retrofit 的Call

OkHttpCall(RequestFactory requestFactory, Object[] args,
      okhttp3.Call.Factory callFactory, Converter<ResponseBody, T> responseConverter) {
    this.requestFactory = requestFactory; // 之前解析的请求工厂
    this.args = args; // 参数
    this.callFactory = callFactory; // call工厂
    this.responseConverter = responseConverter; // 响应转换器 
    // 进行复制初始化操作
  }

CallAdapter # adapt();
如果我这里暂时使用 RxJava2CallAdapterFactory ,在执行 get() 方法的时候 创建 RxJava2CallAdapter 类

@Override
  public CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
    Class<?> rawType = getRawType(returnType);
    if (rawType == Completable.class) { // 返回类型是否是Completable类
      // Completable is not parameterized (which is what the rest of this method deals with) so it
      // can only be created with a single configuration.
      return new RxJava2CallAdapter(Void.class, scheduler, false, true, false, false, false, true);
    boolean isFlowable = rawType == Flowable.class;
    boolean isSingle = rawType == Single.class;
    boolean isMaybe = rawType == Maybe.class;
    if (rawType != Observable.class && !isFlowable && !isSingle && !isMaybe) { // 不是这些类型就返回null 接着让默认请求适配器去处理
      return null;
    boolean isResult = false;
    boolean isBody = false;
    Type responseType;
    if (!(returnType instanceof ParameterizedType)) { // 非参数化类型
      String name = isFlowable ? "Flowable" : isSingle ? "Single" : "Observable";
      throw new IllegalStateException(name + " return type must be parameterized"
          + " as " + name + "<Foo> or " + name + "<? extends Foo>");
    Type observableType = getParameterUpperBound(0, (ParameterizedType) returnType); // 获取当前返回类型的具体类型
    Class<?> rawObservableType = getRawType(observableType);
    if (rawObservableType == Response.class) { // 是Response
      if (!(observableType instanceof ParameterizedType)) { // 非参数化类型 抛出异常
        throw new IllegalStateException("Response must be parameterized"
            + " as Response<Foo> or Response<? extends Foo>");
      responseType = getParameterUpperBound(0, (ParameterizedType) observableType); // 获取当前返回类型的具体类型
    } else if (rawObservableType == Result.class) { // 是Result
      if (!(observableType instanceof ParameterizedType)) { // 非参数化类型 抛出异常
        throw new IllegalStateException("Result must be parameterized"
            + " as Result<Foo> or Result<? extends Foo>");
      responseType = getParameterUpperBound(0, (ParameterizedType) observableType); // 获取当前返回类型的具体类型
      isResult = true;
    } else {
      responseType = observableType;
      isBody = true;
    // 实例化RxJava2CallAdapter对象
    return new RxJava2CallAdapter(responseType, scheduler, isResult, isBody, isFlowable,
        isSingle, isMaybe, false);
  }

开始执行 adapt() 方法。 由上面的代码可知 isBody:true 其他均为false

@Override public <R> Object adapt(Call<R> call) {
    Observable<Response<R>> responseObservable = new CallObservable<>(call); // 创建一个被观察者
    Observable<?> observable;
    if (isResult) {
      observable = new ResultObservable<>(responseObservable);
    } else if (isBody) { // 会进入到这个判断中
      observable = new BodyObservable<>(responseObservable);
    } else {
      observable = responseObservable;
    if (scheduler != null) {
      observable = observable.subscribeOn(scheduler);
    if (isFlowable) {
      return observable.toFlowable(BackpressureStrategy.LATEST);
    if (isSingle) {
      return observable.singleOrError();
    if (isMaybe) {
      return observable.singleElement();
    if (isCompletable) {
      return observable.ignoreElements();
    return observable; // 然后直接返回 等待RxJava进入调用流程 会从subscribeActual调用上来
  }

假设现在的RxJava已经开始调用这个接口方法了,调用到Retrofit中的 subscribeActual 中了,这个时候开始执行 BodyObservable 方法。

@Override protected void subscribeActual(Observer<? super T> observer) {
    upstream.subscribe(new BodyObserver<>(observer)); // 开始调用upstream中的subscribe。upstream这个方法我们看源码是知道是谁的 
  // 从这里可以知道 这里调用的是创建的时候的类,我们看到上面的代码有这个方法的调用
  BodyObservable(Observable<Response<T>> upstream) {
    this.upstream = upstream;
  }

Observable<Response> responseObservable = new CallObservable<>(call); // 创建一个被观察者
new BodyObservable<>(responseObservable);
所以代码追溯到 CallObservable的subscribeActual

CallObservable # subscribeActual

@Override protected void subscribeActual(Observer<? super Response<T>> observer) {
    // Since Call is a one-shot type, clone it for each new observer.
    Call<T> call = originalCall.clone(); // 对原始的请求数据进行克隆
    observer.onSubscribe(new CallDisposable(call)); // 开始执行onSubscribe方法
    boolean terminated = false;
    try {
      Response<T> response = call.execute(); // 请求开始执行 会进行阻塞
      if (!call.isCanceled()) { // 请求未被取消 拿到数据之后进行传递 执行onNext方法
        observer.onNext(response);
      if (!call.isCanceled()) { // 未被取消 则执行完成
        terminated = true;
        observer.onComplete();
    } catch (Throwable t) {
      Exceptions.throwIfFatal(t);
      if (terminated) {
        RxJavaPlugins.onError(t); // 执行异常方法
      } else if (!call.isCanceled()) {
        try {
          observer.onError(t);
        } catch (Throwable inner) {
          Exceptions.throwIfFatal(inner);
          RxJavaPlugins.onError(new CompositeException(t, inner));// 执行异常方法
  }

Response response = call.execute(); 这个地方的Call在执行adapt(Call)传进来的。所以这个Call的实体是OkHttpCall,execute的实现方法在OkHttpCall类中。

@Override public Response<T> execute() throws IOException {
    okhttp3.Call call;
    synchronized (this) { // 加锁处理 防止重复执行当前请求
      if (executed) throw new IllegalStateException("Already executed.");
      executed = true;
      if (creationFailure != null) { // 创建RealCall失败 出现了异常 进行处理
        if (creationFailure instanceof IOException) {
          throw (IOException) creationFailure;
        } else if (creationFailure instanceof RuntimeException) {
          throw (RuntimeException) creationFailure;
        } else {
          throw (Error) creationFailure;
      call = rawCall;
      if (call == null) { // 第一次执行时 为null
        try {
          call = rawCall = createRawCall(); // 创建一个RealCall
        } catch (IOException | RuntimeException | Error e) {
          throwIfFatal(e); //  Do not assign a fatal error to creationFailure.
          creationFailure = e;
          throw e;
    if (canceled) {
      call.cancel();
    return parseResponse(call.execute()); // 执行网络请求 和 解析响应
  }

createRawCall();

private okhttp3.Call createRawCall() throws IOException {
    // callFactory 就是之前初始化的OkHttpClient
    okhttp3.Call call = callFactory.newCall(requestFactory.create(args));
    if (call == null) {
      throw new NullPointerException("Call.Factory returned null.");
    return call;
  }

callFactory.newCall(requestFactory.create(args)); 现在请求执行到了OkHttp

@Override public Call newCall(Request request) {
    return RealCall.newRealCall(this, request, false /* for web socket */);
  }

OkHttp后面的代码就不进行分析了,上一篇已经进行了分析,有兴趣的可以爬楼看看(▽);

parseResponse(call.execute()); // 执行网络请求 和 解析响应
call.execute(); 也是调用 OkHttp 中 RealCall 的 execute() 方法。
下面我们在来看看 parseResponse() 拿到请求数据之后的解析工作吧

OkHttpCall # parseResponse

Response<T> parseResponse(okhttp3.Response rawResponse) throws IOException {
    ResponseBody rawBody = rawResponse.body(); // 拿到返回过来的响应体
    // Remove the body's source (the only stateful object) so we can pass the response along.
    // 移除主体的源(唯一有状态的对象),这样我们就可以传递响应。
    rawResponse = rawResponse.newBuilder()
        .body(new NoContentResponseBody(rawBody.contentType(), rawBody.contentLength()))
        .build();
    int code = rawResponse.code(); // 响应码
    if (code < 200 || code >= 300) { // 响应异常情况
      try {
        // Buffer the entire body to avoid future I/O.
        ResponseBody bufferedBody = Utils.buffer(rawBody);
        return Response.error(bufferedBody, rawResponse); // 将请求异常的情况进行返回
      } finally {
        rawBody.close();
    if (code == 204 || code == 205) { // 请求成功情况 只是返回数据为null
      rawBody.close();
      return Response.success(null, rawResponse);
    ExceptionCatchingResponseBody catchingBody = new ExceptionCatchingResponseBody(rawBody);
    try {
      T body = responseConverter.convert(catchingBody); // 转换器开始工作了
      return Response.success(body, rawResponse);
    } catch (RuntimeException e) {
      // If the underlying source threw an exception, propagate that rather than indicating it was
      // a runtime exception.
      catchingBody.throwIfCaught(); // 转换器转换出现异常
      throw e;
  }

由于我做了转换器的添加,所以代码执行到这里,
由于上面的 requestBodyConverter 方法里创建了 WGsonRequestBodyConverter

@Override
  public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[]  methodAnnotations, Retrofit retrofit) {
    TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
    return new WGsonRequestBodyConverter<>(gson, adapter);
  }

所以执行 convert 方法的时候执行的也是这个类里面的方法。

// 
final class WGsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
  private final Gson gson;
  private final TypeAdapter<T> adapter;
  WGsonResponseBodyConverter(Gson gson, TypeAdapter<T> adapter) {
    this.gson = gson;
    this.adapter = adapter;
  @Override public T convert(ResponseBody value) throws IOException {
    JsonReader jsonReader = gson.newJsonReader(value.charStream()); // 将Reader数据转为JsonReader
    try {
      T result = adapter.read(jsonReader); // 开始阅读JsonReader对象
      if (jsonReader.peek() != JsonToken.END_DOCUMENT) {
        throw new JsonIOException("JSON document was not fully consumed.");
      return result;
    } finally {
      value.close();
}

gson.newJsonReader(value.charStream()); 调用到 Gson # newJsonReader

public JsonReader newJsonReader(Reader reader) {
    JsonReader jsonReader = new JsonReader(reader); // 对Reader进行成员参数赋值
    jsonReader.setLenient(lenient); // 因为我在初始化的时候进行设置为true的操作 所以这个变量为true
    return jsonReader; // 返回JsonReader实例对象
  }

实例化 JsonReader 对象

public JsonReader(Reader in) {
    if (in == null) {
      throw new NullPointerException("in == null");
    this.in = in; // 进行成员参数赋值
  }

adapter.read() 因为adapter需要去执行read方法 我们先需要了解adapter是怎么来的。

requestBodyConverter 方法中有 getAdapter

public <T> TypeAdapter<T> getAdapter(TypeToken<T> type) {
    // 获取缓存中的请求adapter是否存在,存在即返回 
    TypeAdapter<?> cached = typeTokenCache.get(type == null ? NULL_KEY_SURROGATE : type);
    if (cached != null) {
      return (TypeAdapter<T>) cached;
    // 本地线程缓冲中获取当前线程的请求数据信息
    Map<TypeToken<?>, FutureTypeAdapter<?>> threadCalls = calls.get();
    boolean requiresThreadLocalCleanup = false; // 是否清除本地线程缓冲数据
    if (threadCalls == null) { // null 本地线程缓冲中不存在
      threadCalls = new HashMap<TypeToken<?>, FutureTypeAdapter<?>>(); // 实例化一个hashmap
      calls.set(threadCalls); // 缓存至TLB中
      requiresThreadLocalCleanup = true; // 进行清除
    // the key and value type parameters always agree
    FutureTypeAdapter<T> ongoingCall = (FutureTypeAdapter<T>) threadCalls.get(type); // 获取当前返回类型的FutureTypeAdapter适配器
    if (ongoingCall != null) { // 已经存在当前返回值的适配器 直接返回
      return ongoingCall;
    try { // 当前FutureTypeAdapter适配器依旧为null 创建一个适配器
      FutureTypeAdapter<T> call = new FutureTypeAdapter<T>();
      threadCalls.put(type, call); // 并将当前适配器与对应的type保存到HashMap中
      // 在gson初始化的List<TypeAdapterFactory>中查找对应的TypeAdapter
      for (TypeAdapterFactory factory : factories) { // 开始进行遍历类型适配器的工厂
        TypeAdapter<T> candidate = factory.create(this, type); // 获取到解析适配器
        if (candidate != null) {
          call.setDelegate(candidate); // 设置参数
          typeTokenCache.put(type, candidate); // 存入缓存Map集合中
          return candidate;
      throw new IllegalArgumentException("GSON cannot handle " + type);
    } finally {
      threadCalls.remove(type);
      if (requiresThreadLocalCleanup) {
        calls.remove();

GsonBuilder

public Gson create() {
    // 这里的factories是为null  hierarchyFactories也为null
    List<TypeAdapterFactory> factories = new ArrayList<TypeAdapterFactory>(this.factories.size() + this.hierarchyFactories.size() + 3);
    factories.addAll(this.factories);
    Collections.reverse(factories);
    List<TypeAdapterFactory> hierarchyFactories = new ArrayList<TypeAdapterFactory>(this.hierarchyFactories);
    Collections.reverse(hierarchyFactories);
    factories.addAll(hierarchyFactories);
    // 添加了三个TypeAdapter
    // factories.add(TypeAdapters.newFactory(Date.class, dateTypeAdapter)); 日期类型
    // factories.add(TypeAdapters.newFactory(Timestamp.class, timestampTypeAdapter)); 时间戳
    // factories.add(TypeAdapters.newFactory(java.sql.Date.class, javaSqlDateTypeAdapter)); java数据库时间类型
    addTypeAdaptersForDate(datePattern, dateStyle, timeStyle, factories);
    return new Gson(excluder, fieldNamingPolicy, instanceCreators,
        serializeNulls, complexMapKeySerialization,
        generateNonExecutableJson, escapeHtmlChars, prettyPrinting, lenient,
        serializeSpecialFloatingPointValues, longSerializationPolicy, factories); // 开始初始化gson
  }

new Gson();

Gson(final Excluder excluder, final FieldNamingStrategy fieldNamingStrategy,
      final Map<Type, InstanceCreator<?>> instanceCreators, boolean serializeNulls,
      boolean complexMapKeySerialization, boolean generateNonExecutableGson, boolean htmlSafe,
      boolean prettyPrinting, boolean lenient, boolean serializeSpecialFloatingPointValues,
      LongSerializationPolicy longSerializationPolicy,
      List<TypeAdapterFactory> typeAdapterFactories) {
    this.constructorConstructor = new ConstructorConstructor(instanceCreators);
    this.excluder = excluder;
    this.fieldNamingStrategy = fieldNamingStrategy;
    this.serializeNulls = serializeNulls;
    this.generateNonExecutableJson = generateNonExecutableGson;
    this.htmlSafe = htmlSafe;
    this.prettyPrinting = prettyPrinting;
    this.lenient = lenient;
    List<TypeAdapterFactory> factories = new ArrayList<TypeAdapterFactory>();
    // built-in type adapters that cannot be overridden
    factories.add(TypeAdapters.JSON_ELEMENT_FACTORY);
    factories.add(ObjectTypeAdapter.FACTORY);
    // the excluder must precede all adapters that handle user-defined types
    factories.add(excluder); // 排除器的添加  
    // user's type adapters 用户添加的类型
    factories.addAll(typeAdapterFactories);
  ....省略部分代码
  }

上面的代码拿到 Adapter ,开始进行json数据的解析

T result = adapter.read(jsonReader)
因为我的项目导入是使用Retrofit进行导入的 所以我查看我的gson版本是2.8.2

ReflectiveTypeAdapterFactory 查看这个类的解析用了些什么方法

@Override public T read(JsonReader in) throws IOException {
      if (in.peek() == JsonToken.NULL) { // 得到 JsonToken.BEGIN_OBJECT false 不进入当前判断
        in.nextNull();
        return null;
      T instance = constructor.construct(); // 初始化操作
      try {
        in.beginObject(); // 开始解析开始对象
        while (in.hasNext()) { // 是否有下一个 第一次到这里 返回 PEEKED_DOUBLE_QUOTED_NAME true
          String name = in.nextName(); // 获取name信息
          BoundField field = boundFields.get(name); // 根据集合去获取里面的字段信息
          if (field == null || !field.deserialized) { // 如果字段为null 或者 字段不能反序列化
            in.skipValue(); // 跳过value值 因为解析的类对象中不存在当前字段 || 或者这个字段可以 不管不能反序列化
          } else {
            field.read(in, instance); // 这里开始执行到 根据字段类型去读取value值
     ....省略部分代码
    }

JsonReader # peek();

public JsonToken peek() throws IOException {
    int p = peeked; // 之前的代码未进行赋值操作 所以这个为默认值 PEEKED_NONE
    if (p == PEEKED_NONE) {
      p = doPeek(); // 进入到doPeek()中 根据上面示例json数据 可以知道这个返回为 PEEKED_BEGIN_OBJECT 对象开始标志
    ....省略部分代码
  }

JsonReader # doPeek(); 如果返回之后的 json = {“username”:“hello”,“age”:18}

int doPeek() throws IOException {
    // 第一次进入到这个方法 stack的长度为32 stackSize值为1 stack[0] = EMPTY_DOCUMENT;
    int peekStack = stack[stackSize - 1]; // 32 length [0] = EMPTY_DOCUMENT 第二次进来 [1] = EMPTY_OBJECT
    if (peekStack == JsonScope.EMPTY_ARRAY) {
      stack[stackSize - 1] = JsonScope.NONEMPTY_ARRAY;
    } else if (peekStack == JsonScope.NONEMPTY_ARRAY) {
      // Look for a comma before the next element.
      int c = nextNonWhitespace(true); // 获取下一个非空白字符
      switch (c) {
      case ']':
        return peeked = PEEKED_END_ARRAY; // 集合结束字符
      case ';':
        checkLenient(); // fall-through
      case ',':
        break;
      default:
        throw syntaxError("Unterminated array");
      ....省略部分代码
  }

JsonReader # nextNonWhitespace()

返回流中的下一个字符,该字符既不是空格,也不是注释的一部分。返回时,返回的字符始终位于缓冲区[pos-1];这意味着调用者总是可以通过减少pos来推回返回的字符。

private int nextNonWhitespace(boolean throwOnEof) throws IOException {
    char[] buffer = this.buffer;
    int p = pos; // 0
    int l = limit; // 0
    while (true) {
      if (p == l) {
        pos = p; 
        if (!fillBuffer(1)) { // 获取数据基础信息 当前位置 和 数据长度
          break;
        p = pos;
        l = limit;
      ....省略部分代码
  }

JsonReader # fillBuffer()

private boolean fillBuffer(int minimum) throws IOException {
    char[] buffer = this.buffer;
    lineStart -= pos; // 最开始的时候 lineStart = 0 pos 没有不符合条件的字符 所以 pos = 0
    if (limit != pos) { // limit 最开始也是 0  未进行赋值操作
      limit -= pos;
      System.arraycopy(buffer, pos, buffer, 0, limit); // 进行数据的深拷贝 将前面不符合条件的字符进行覆盖处理
    } else {
      limit = 0;
    // 开始进入下一步
    pos = 0;
    int total;
   ....省略部分代码
  }

JsonReader # checkLenient() 检查设置是否为true

private void checkLenient() throws IOException {
    if (!lenient) { // false就一定会抛出异常 所以需要在初始化的时候设置为true
      throw syntaxError("Use JsonReader.setLenient(true) to accept malformed JSON");
  }

JsonReader # peekKeyword()

private int peekKeyword() throws IOException {
    // Figure out which keyword we're matching against by its first character.
    char c = buffer[pos];
    String keyword;
    String keywordUpper;
    int peeking;
    if (c == 't' || c == 'T') { // 对返回值t、T做处理
      keyword = "true";
      keywordUpper = "TRUE";
      peeking = PEEKED_TRUE;
    } else if (c == 'f' || c == 'F') { // 对返回值F、f做处理
     ....省略部分代码
  }

JsonReader # isLiteral()

private boolean isLiteral(char c) throws IOException {
    switch (c) {
    case '/':
    case '\\':
    case ';':
    case '#':
    case '=':
      checkLenient(); // fall-through
    ....省略部分代码
  }

JsonReader # peekNumber()

private int peekNumber() throws IOException {
    // Like nextNonWhitespace, this uses locals 'p' and 'l' to save inner-loop field access.
    char[] buffer = this.buffer;
    int p = pos;
    int l = limit;
    long value = 0; // Negative to accommodate Long.MIN_VALUE more easily.
    boolean negative = false;
    boolean fitsInLong = true;
    int last = NUMBER_CHAR_NONE; // 0
    int i = 0;
    charactersOfNumber:
    for (; true; i++) {
      if (p + i == l) { // 如果当前遍历的数据已经到了拿取数据的最后位置
        if (i == buffer.length) { // 是否没有数据流
          // Though this looks like a well-formed number, it's too long to continue reading. Give up
          // and let the application handle this as an unquoted literal.
          return PEEKED_NONE;
      ....省略部分代码
  }

T instance = constructor.construct(); // 对象进行初始化 我们去看看这个是从哪里开始的 我们将代码向上进行追溯,发现是在create中进行的初始化操作,最终追溯到 Gson.getAdapter() 方法中遍历factories,并执行了create方法

factory.create(this, type); ReflectiveTypeAdapterFactory # create(this, type) 因为之前的方法返回是 Observable<BaseJson> type=com.lifeon.watch.base.http.interceptor.BaseJson<com.lifeon.watch.app.http.response.ResponseAppVersionInfo>hashcode = 503989398 rawType = com.lifeon.watch.base.http.interceptor.BaseJson


ConstructorConstructor # get()

public <T> ObjectConstructor<T> get(TypeToken<T> typeToken) {
    // com.lifeon.watch.base.http.interceptor.BaseJson<com.lifeon.watch.app.http.response.ResponseAppVersionInfo>
    final Type type = typeToken.getType(); 
    // com.lifeon.watch.base.http.interceptor.BaseJson
    final Class<? super T> rawType = typeToken.getRawType();
    @SuppressWarnings("unchecked") // types must agree
    final InstanceCreator<T> typeCreator = (InstanceCreator<T>) instanceCreators.get(type); // 集合中获取type类型的实例对象
    if (typeCreator != null) {
      return new ObjectConstructor<T>() { // 根据type 创建一个对象的实例
        @Override public T construct() {
          return typeCreator.createInstance(type);
    @SuppressWarnings("unchecked") // types must agree
    final InstanceCreator<T> rawTypeCreator =
        (InstanceCreator<T>) instanceCreators.get(rawType); // 集合中是否有rawType类型的实例
    if (rawTypeCreator != null) {
      return new ObjectConstructor<T>() {
        @Override public T construct() { // 根据rawType 创建一个对象实例
          return rawTypeCreator.createInstance(type);
    ObjectConstructor<T> defaultConstructor = newDefaultConstructor(rawType); // 创建一个默认的构造器
    if (defaultConstructor != null) {
      return defaultConstructor; // 然后进行返回
    ObjectConstructor<T> defaultImplementation = newDefaultImplementationConstructor(type, rawType);
    if (defaultImplementation != null) {
      return defaultImplementation;
    // finally try unsafe
    return newUnsafeAllocator(type, rawType);
  }

ConstructorConstructor # newDefaultConstructor()

private <T> ObjectConstructor<T> newDefaultConstructor(Class<? super T> rawType) {
    try {
      final Constructor<? super T> constructor = rawType.getDeclaredConstructor();
      if (!constructor.isAccessible()) {
        constructor.setAccessible(true);
      ....省略部分代码
  }

BaseJson 源代码

public class BaseJson<T> {
    private int code;
    private String message;
    private T data;
    public int getCode() {
        return code;
    ....省略部分代码
}

ReflectiveTypeAdapterFactory # getBoundFields()

private Map<String, BoundField> getBoundFields(Gson context, TypeToken<?> type, Class<?> raw) {
    Map<String, BoundField> result = new LinkedHashMap<String, BoundField>(); // 创建LinkedHashMap
    if (raw.isInterface()) { // 判断rawType是否是接口类 false
      return result;
    Type declaredType = type.getType(); // 拿到type类型
    while (raw != Object.class) { // rawType非Object类型
      Field[] fields = raw.getDeclaredFields(); // 获取BaseJson中所有字段 三个
      for (Field field : fields) {
        boolean serialize = excludeField(field, true); // 使用排除器 是否排除当前字段得到结果 可序列化
        boolean deserialize = excludeField(field, false); // 可反序列化
        if (!serialize && !deserialize) { // 序列化和反序列化均不行 不管当前字段 进行下一个字段的执行
          continue;
        field.setAccessible(true); // 设置字段的权限
        Type fieldType = $Gson$Types.resolve(type.getType(), raw, field.getGenericType()); // 获取当前字段的类型
        List<String> fieldNames = getFieldNames(field); // 获取当前字段的名称
        BoundField previous = null;
        for (int i = 0, size = fieldNames.size(); i < size; ++i) {
          String name = fieldNames.get(i);
          if (i != 0) serialize = false; // only serialize the default name 只进行序列化默认第一个名称
          BoundField boundField = createBoundField(context, field, name,
              TypeToken.get(fieldType), serialize, deserialize); // 实例化BoundField对象
          BoundField replaced = result.put(name, boundField); // 将字段和boundField放入到链表hasp表中
          if (previous == null) previous = replaced; // 如果前一个字段boundField为null 进行赋值
        if (previous != null) { //  声明了多个名为name的字段
          throw new IllegalArgumentException(declaredType
              + " declares multiple JSON fields named " + previous.name);
      type = TypeToken.get($Gson$Types.resolve(type.getType(), raw, raw.getGenericSuperclass()));
      raw = type.getRawType();
    return result;
  }

ReflectiveTypeAdapterFactory # createBoundField()

private ReflectiveTypeAdapterFactory.BoundField createBoundField(
      final Gson context, final Field field, final String name,
      final TypeToken<?> fieldType, boolean serialize, boolean deserialize) {
    final boolean isPrimitive = Primitives.isPrimitive(fieldType.getRawType()); // 判断是否是八大基础类型 + void类型 
    // special casing primitives here saves ~5% on Android...
    JsonAdapter annotation = field.getAnnotation(JsonAdapter.class); // 获取字段上面的json解析注解
    TypeAdapter<?> mapped = null;
    if (annotation != null) { // 注解不为空的情况 开始解析注解 我们没有注解 是不管
      mapped = jsonAdapterFactory.getTypeAdapter(
          constructorConstructor, context, fieldType, annotation);
   ....省略部分代码
  }

没有注解的情况 调用到 Gson.getAdapter(); (之前有做过解析) -----根据字段类型 获取符合条件的TypeAdapter

Adapter(ObjectConstructor<T> constructor, Map<String, BoundField> boundFields) {
      this.constructor = constructor;
      this.boundFields = boundFields;
    }

接着上面json解析的过程 下面应该执行

T instance = constructor.construct();
由上面代码的分析 可以知道 会执行这个方法。

@Override public T construct() {
          try {
            Object[] args = null;
            return (T) constructor.newInstance(args); // 对拿到的解析类进行实例化操作
          } catch (InstantiationException e) {
            // TODO: JsonParseException ?
            throw new RuntimeException("Failed to invoke " + constructor + " with no args", e);
          } catch (InvocationTargetException e) {
            // TODO: don't wrap if cause is unchecked!
            // TODO: JsonParseException ?
            throw new RuntimeException("Failed to invoke " + constructor + " with no args",
                e.getTargetException());
          } catch (IllegalAccessException e) {
            throw new AssertionError(e);
        }

接着分析

JsonReader # beginObject()

public void beginObject() throws IOException {
    int p = peeked;
    if (p == PEEKED_NONE) { // 上面代码执行之后是PEEKED_BEGIN_OBJECT
      p = doPeek();
    if (p == PEEKED_BEGIN_OBJECT) { // 进入当前方法
      push(JsonScope.EMPTY_OBJECT);
      peeked = PEEKED_NONE;
    } else {
      throw new IllegalStateException("Expected BEGIN_OBJECT but was " + peek() + locationString());
  private void push(int newTop) {
    if (stackSize == stack.length) { // 如果stackSize=32 开始进行扩容处理
      int[] newStack = new int[stackSize * 2];
      int[] newPathIndices = new int[stackSize * 2];
      String[] newPathNames = new String[stackSize * 2];
      System.arraycopy(stack, 0, newStack, 0, stackSize);
      System.arraycopy(pathIndices, 0, newPathIndices, 0, stackSize);
      System.arraycopy(pathNames, 0, newPathNames, 0, stackSize);
      stack = newStack;
      pathIndices = newPathIndices;
      pathNames = newPathNames;
    stack[stackSize++] = newTop; // 按照上面的代码 可知 stackSize = 1 所以在下标为1的位置设置 EMPTY_OBJECT
  }

ReflectiveTypeAdapterFactory 开始执行是否有下一个 in.hasNext();

public boolean hasNext() throws IOException {
    int p = peeked;
    if (p == PEEKED_NONE) { // 由beginObject方法可知 判断正确 进入if
      p = doPeek(); // 第一次执行拿到 PEEKED_DOUBLE_QUOTED_NAME  pos值为2
    return p != PEEKED_END_OBJECT && p != PEEKED_END_ARRAY; // 返回 true
  }

in.nextName(); 获取下一个名字 JsonReader # nextName();

public String nextName() throws IOException {
    int p = peeked;
    if (p == PEEKED_NONE) {
      p = doPeek();
    String result;
    if (p == PEEKED_UNQUOTED_NAME) { // 如果上一个字符是无引号
      result = nextUnquotedValue();
    } else if (p == PEEKED_SINGLE_QUOTED_NAME) { // 如果上一个字符是单引号
      result = nextQuotedValue('\'');
    } else if (p == PEEKED_DOUBLE_QUOTED_NAME) { // 如果上一个字符是双引号
      result = nextQuotedValue('"'); // 获取当前双引号之间的数据信息
    } else {
      throw new IllegalStateException("Expected a name but was " + peek() + locationString());
    peeked = PEEKED_NONE;
    pathNames[stackSize - 1] = result;
    return result;
  }

JsonReader # nextQuotedValue(’"’) json = {“username”:“hello”,“age”:18}


private String nextQuotedValue(char quote) throws IOException {
    // Like nextNonWhitespace, this uses locals 'p' and 'l' to save inner-loop field access.
    char[] buffer = this.buffer;
    StringBuilder builder = null;
    while (true) {
      int p = pos; // 根据上面的解析流程 这个pos = 2
      int l = limit;
      /* the index of the first character not yet appended to the builder. */
      int start = p;
      while (p < l) {
        int c = buffer[p++]; // buffer[2] = "u"
     ....省略部分代码
  }

拿到name之后开始获取name对应的value值 in.skipValue()

JsonReader # skipValue()

public void skipValue() throws IOException {
    int count = 0;
      int p = peeked;
      if (p == PEEKED_NONE) { // 上面的name获取完成 重新置为NONE pos = 11 (根据示例json进行解析查看情况的)
        p = doPeek(); // 下一个符号是冒号 : peekStack = DANGLING_NAME 进行处理 拿到双引号 返回 PEEKED_DOUBLE_QUOTED
      if (p == PEEKED_BEGIN_ARRAY) {
        push(JsonScope.EMPTY_ARRAY);
        count++;
      } else if (p == PEEKED_BEGIN_OBJECT) {
        push(JsonScope.EMPTY_OBJECT);
        count++;
      } else if (p == PEEKED_END_ARRAY) {
        stackSize--;
        count--;
      } else if (p == PEEKED_END_OBJECT) {
        stackSize--;
        count--;
      } else if (p == PEEKED_UNQUOTED_NAME || p == PEEKED_UNQUOTED) {
        skipUnquotedValue();
      } else if (p == PEEKED_SINGLE_QUOTED || p == PEEKED_SINGLE_QUOTED_NAME) {
        skipQuotedValue('\'');
      } else if (p == PEEKED_DOUBLE_QUOTED || p == PEEKED_DOUBLE_QUOTED_NAME) {
        skipQuotedValue('"'); // 进入到这个方法之前执性了两次获取下一个字符 这里得到的 pos = 13
      } else if (p == PEEKED_NUMBER) {
        pos += peekedNumberLength;
      peeked = PEEKED_NONE;
    } while (count != 0);
    pathIndices[stackSize - 1]++;
    pathNames[stackSize - 1] = "null";
  }

JsonReader # skipQuotedValue()

private void skipQuotedValue(char quote) throws IOException {
    // Like nextNonWhitespace, this uses locals 'p' and 'l' to save inner-loop field access.
    char[] buffer = this.buffer;
      int p = pos; // 13
      int l = limit; // 29
      /* the index of the first character not yet appended to the builder. */
      while (p < l) {
        int c = buffer[p++]; // 第一次遍历 拿到是[13]= 'h'
        if (c == quote) { // 拿到下一个 "  直接返回
          pos = p; // 因为上面的示例代码是有双引号的 即 pos = 19
          return;
        } else if (c == '\\') {
          pos = p;
          readEscapeCharacter();
          p = pos;
          l = limit;
        } else if (c == '\n') { // 遍历到换行符
          lineNumber++; // 进行 +1 操作
          lineStart = p; // 行开始位置
      pos = p;
    } while (fillBuffer(1));
    throw syntaxError("Unterminated string");
  }

如果执行skipValue,pos = 19; 不执行的话 目前没有跳过 pos = 11
下面看执行read操作

field.read(in, instance);
new ReflectiveTypeAdapterFactory.BoundField

@Override void read(JsonReader reader, Object value)
          throws IOException, IllegalAccessException { // 在下面的时候会进行解析到这里
        Object fieldValue = typeAdapter.read(reader); // 因为上面解析的是String类型 对应的也是String 执行这个的读取操作
        if (fieldValue != null || !isPrimitive) { // 拿到filedValue = "hello" 不为null
          field.set(value, fieldValue); // 执行set方法 将value值和对应的实例 保存到字段信息中
      }

TypeAdapters # STRING 中进行执行read操作 因为原有的项目json字符串比较长 所以还是按照上面json进行解析

public static final TypeAdapter<String> STRING = new TypeAdapter<String>() {
    @Override
    public String read(JsonReader in) throws IOException {
      // 进入到peek方法中拿到 peek 这里的pos = 11 下一个符号是冒号 : peekStack = DANGLING_NAME 进行处理 拿到双引号 返回 PEEKED_DOUBLE_QUOTED
      JsonToken peek = in.peek(); // 拿到JsonToken JsonToken.STRING
      if (peek == JsonToken.NULL) { // 空
        in.nextNull();
        return null;
      /* coerce booleans to strings for backwards compatibility */
      if (peek == JsonToken.BOOLEAN) { // boolean处理
        return Boolean.toString(in.nextBoolean());
      return in.nextString(); // 获取下一个String
    @Override
    public void write(JsonWriter out, String value) throws IOException {
      out.value(value);
  };

in.nextString(); JsonReader # nextString();

public String nextString() throws IOException { // peeked = PEEKED_DOUBLE_QUOTED
    int p = peeked;
    if (p == PEEKED_NONE) {
      p = doPeek();
    String result;
    if (p == PEEKED_UNQUOTED) {
      result = nextUnquotedValue();
    } else if (p == PEEKED_SINGLE_QUOTED) {
      result = nextQuotedValue('\'');
    } else if (p == PEEKED_DOUBLE_QUOTED) { // 双引号进入到这个方法进行执行
      result = nextQuotedValue('"'); // 获取到下一个双引号的位置 并且返回这之间的所有数据 "hello" 上面有进行这个方法的解析过程
    } else if (p == PEEKED_BUFFERED) {
      result = peekedString;
      peekedString = null;
    } else if (p == PEEKED_LONG) {
      result = Long.toString(peekedLong);
    } else if (p == PEEKED_NUMBER) {
      result = new String(buffer, pos, peekedNumberLength);
      pos += peekedNumberLength;
    } else {
      throw new IllegalStateException("Expected a string but was " + peek() + locationString());
    peeked = PEEKED_NONE;
    pathIndices[stackSize - 1]++;
    return result;
  }

第一个json字段的对应的name和value数据都拿到,下一步判断是否还有下一步

while (in.hasNext()) {}
// 根据上面拿到value值 pos = 19 peeked = PEEKED_NONE stack[stackSize - 1] = JsonScope.NONEMPTY_OBJECT 进入hasNext()之后 stack[stackSize - 1] = JsonScope.DANGLING_NAME
根据上面代码得知 in.hasNext() = true; pos = 21 peeked = PEEKED_DOUBLE_QUOTED_NAME
对此持续循环解析,拿到 in.nextName= “age”; pos = 25 peeked = PEEKED_NONE
之后判断承载对象的类中是否有这个字段,有,进行int解析,没有,跳过当前值

TypeAdapters # INTEGER field.read()

public static final TypeAdapter<Number> INTEGER = new TypeAdapter<Number>() {
    @Override
    public Number read(JsonReader in) throws IOException {
      if (in.peek() == JsonToken.NULL) {
        in.nextNull();
        return null;
      try {
        return in.nextInt(); // 开始进行数值解析
      } catch (NumberFormatException e) {
        throw new JsonSyntaxException(e);
    @Override
    public void write(JsonWriter out, Number value) throws IOException {
      out.value(value);
  };

JsonReader # nextInt() 获取

public int nextInt() throws IOException {
    int p = peeked;
    if (p == PEEKED_NONE) { // stack[stackSize - 1] = JsonScope.NONEMPTY_OBJECT;
      p = doPeek(); 
      // 先拿到 : 不管 pos = 26  ‘1’ pos = 27 会执行 pos-- 所以 pos= 26 检查是否是关键字 false 检查是否是number true
      // value = 18  peek = PEEKED_LONG
  }

执行结束之后
stack[stackSize - 1] = JsonScope.NONEMPTY_OBJECT peeked = PEEKED_NONE pos = 28 再进行执行 in.hasNext() 字符为 ‘}’ stack[stackSize - 1] = JsonScope.DANGLING_NAME; peeked = PEEKED_END_OBJECT pos = 29
hasNext() 执行之后返回false 表示没有下一个数据了 已经结束了

执行 in.endObject();

public void endObject() throws IOException {
    int p = peeked;
    if (p == PEEKED_NONE) {
      p = doPeek();
    if (p == PEEKED_END_OBJECT) { // 回到初始化状态 等待下一次的分析进入
      stackSize--;
      pathNames[stackSize] = null; // Free the last path name so that it can be garbage collected!
      pathIndices[stackSize - 1]++;
      peeked = PEEKED_NONE;
    } else {
      throw new IllegalStateException("Expected END_OBJECT but was " + peek() + locationString());
     ....省略部分代码
  }

我们需要整理一下上面代码执行完之后重要参数的值目前是什么
pos = 29 peeked = PEEKED_NONE
因为stackSize-- 自减 根据之前的代码分析可以知道 stackSize = 2 endObject之后 stackObject = 1
那么 stack[stackSize - 1] = JsonScope.NONEMPTY_DOCUMENT; // 最开始的时候进行的赋值操作

json数据就已经解析完了,并返回了一个实例类 instance ,代码开始回到调用convert的方法中

@Override public T convert(ResponseBody value) throws IOException {
    JsonReader jsonReader = gson.newJsonReader(value.charStream());
    try {
      T result = adapter.read(jsonReader); // 上面已经拿到instance 的示例对象了
      // 还有一次peek执行 查看是否已经结束
      // buffer[p++] 得到的值为 -1 所以拿取的peek为END_DOCUMENT
      if (jsonReader.peek() != JsonToken.END_DOCUMENT) {
        throw new JsonIOException("JSON document was not fully consumed.");
      return result; // 解析成功将结果进行返回
    } finally {
      value.close(); // 响应体进行关闭操作
  }

再次回调到

OkHttpCall # parseResponse() 方法中

return Response.success(body, rawResponse); // 返回成功的回调

再次回到

OkHttpCall # execute() 直接将Response进行返回
CallObservable # subscribeActual() 开始接着向下执行

@Override protected void subscribeActual(Observer<? super Response<T>> observer) {
    // Since Call is a one-shot type, clone it for each new observer.
    Call<T> call = originalCall.clone(); // 对原始的请求数据进行克隆
    observer.onSubscribe(new CallDisposable(call)); // 开始执行onSubscribe方法
    boolean terminated = false;
    try {
      Response<T> response = call.execute(); // 请求开始执行 会进行阻塞 拿到Response开始向下分发