【Android】【Gson】对象创建接口的调用流程

首先,在GsonBuilder中注册时,InstanceCreator接口都被放到instanceCreators属性中:

public GsonBuilder registerTypeAdapter(Type type, Object typeAdapter) {
    
    
  $Gson$Preconditions.checkArgument(typeAdapter instanceof JsonSerializer<?>
      || typeAdapter instanceof JsonDeserializer<?>
      || typeAdapter instanceof InstanceCreator<?>
      || typeAdapter instanceof TypeAdapter<?>);
  if (typeAdapter instanceof InstanceCreator<?>) {
    
    
    instanceCreators.put(type, (InstanceCreator) typeAdapter);
  }
  ...
  return this;
}

GsonBuilder创建Gson对象时,instanceCreators属性作为Gson的构造方法参数,传入Gson,然后创建constructorConstructor属性,并用constructorConstructor属性创建Factory,添加到factories队列中:

Gson(...,final Map<Type, InstanceCreator<?>> instanceCreators, ...) {
    
    
    this.constructorConstructor = new ConstructorConstructor(instanceCreators);
    
    factories.add(new ReflectiveTypeAdapterFactory(constructorConstructor, fieldNamingStrategy, excluder, jsonAdapterFactory));
}

当调用fromJson解析Json时,Gson根据对象类型,获取对应的解析器:


public <T> T fromJson(JsonReader reader, Type typeOfT) throws JsonIOException, JsonSyntaxException {
    
    
	...
    TypeAdapter<T> typeAdapter = getAdapter(typeToken);
    T object = typeAdapter.read(reader);
    return object;
  	...
}

遍历factories:

public <T> TypeAdapter<T> getAdapter(TypeToken<T> type) {
    
    
  ...
  for (TypeAdapterFactory factory : factories) {
    
    
    TypeAdapter<T> candidate = factory.create(this, type);
    if (candidate != null) {
    
    
      call.setDelegate(candidate);
      typeTokenCache.put(type, candidate);
      return candidate;
    }
  }
  ...
}

最后会执行到ReflectiveTypeAdapterFactory的create方法,constructorConstructor作为参数也传递了进来:

public final class ReflectiveTypeAdapterFactory implements TypeAdapterFactory {
    
    
	
  private final ConstructorConstructor constructorConstructor;

  public ReflectiveTypeAdapterFactory(ConstructorConstructor constructorConstructor,
      FieldNamingStrategy fieldNamingPolicy, Excluder excluder,
      JsonAdapterAnnotationTypeAdapterFactory jsonAdapterFactory) {
    
    
    this.constructorConstructor = constructorConstructor;
  }
	
  public <T> TypeAdapter<T> create(Gson gson, final TypeToken<T> type) {
    
    
    Class<? super T> raw = type.getRawType();
    ObjectConstructor<T> constructor = constructorConstructor.get(type);
    return new Adapter<T>(constructor, getBoundFields(gson, type, raw));
  }

}
public final class ConstructorConstructor {
    
    

  public <T> ObjectConstructor<T> get(TypeToken<T> typeToken) {
    
    
    final Type type = typeToken.getType();
    final Class<? super T> rawType = typeToken.getRawType();

	...

    final InstanceCreator<T> typeCreator = (InstanceCreator<T>) instanceCreators.get(type);
    if (typeCreator != null) {
    
    
      return new ObjectConstructor<T>() {
    
    
        @Override public T construct() {
    
    
          return typeCreator.createInstance(type);
        }
      };
    }
    
    ...
    
  }
	
}

获取到typeAdapter后,在read方法中,执行了constructor.construct()创建对象:


@Override public T read(JsonReader in) throws IOException {
    
    
    T instance = constructor.construct();
	...
    return instance;
    }

猜你喜欢

转载自blog.csdn.net/qq_23049111/article/details/126351953