资讯专栏INFORMATION COLUMN

追踪解析Gson源码(1)

sewerganger / 1847人阅读

摘要:版本版本简介是谷歌开源的解析工具。其实几款产品的差别都很细微,有谷歌的信仰加成,所以在这里进行一次源码分析。至于和会在后续进行追踪。

零 前期准备 0 FBI WARNING

文章异常啰嗦且绕弯。

1 版本

Gson 版本 : gson 2.8.5

IDE : idea 2018.3

2 Gson 简介

Gson 是谷歌开源的 java json 解析工具。市场上同类的开源产品还有 Fastjson、Jackson、json-lib等。

其实几款产品的差别都很细微,Gson 有谷歌的信仰加成,所以在这里进行一次源码分析。

3 Bean Demo

</>复制代码

  1. package ioc;
  2. /**
  3. * java bean
  4. */
  5. public class Person {
  6. private String name;
  7. private Integer age;
  8. public String getName() {
  9. return name;
  10. }
  11. public void setName(String name) {
  12. this.name = name;
  13. }
  14. public Integer getAge() {
  15. return age;
  16. }
  17. public void setAge(Integer age) {
  18. this.age = age;
  19. }
  20. }
4 main方法

</>复制代码

  1. import com.google.gson.Gson;
  2. public class JsonTest {
  3. public static void main(String[] args){
  4. //示例 json 字符串
  5. String json =
  6. "{" +
  7. " "name": "zhangsan"," +
  8. " "age": 11" +
  9. "}";
  10. //初始化解析器
  11. Gson gson = new Gson();
  12. //json to bean
  13. Person person = gson.fromJson(json,Person.class);
  14. System.out.println(person.getName());
  15. System.out.println(person.getAge());
  16. //bean to json
  17. String json2 = gson.toJson(person);
  18. System.out.println(json2);
  19. }
  20. }
一 初始化 Gson 解析器 1 Gson 构造方法

该 part 的起点:

</>复制代码

  1. Gson gson = new Gson();

追踪 Gson 的无参构造器:

</>复制代码

  1. //Gson.class
  2. public Gson() {
  3. this(Excluder.DEFAULT, FieldNamingPolicy.IDENTITY,
  4. Collections.>emptyMap(), DEFAULT_SERIALIZE_NULLS,
  5. DEFAULT_COMPLEX_MAP_KEYS, DEFAULT_JSON_NON_EXECUTABLE, DEFAULT_ESCAPE_HTML,
  6. DEFAULT_PRETTY_PRINT, DEFAULT_LENIENT, DEFAULT_SPECIALIZE_FLOAT_VALUES,
  7. LongSerializationPolicy.DEFAULT, null, DateFormat.DEFAULT, DateFormat.DEFAULT,
  8. Collections.emptyList(), Collections.emptyList(),
  9. Collections.emptyList());
  10. }

继续追踪:

</>复制代码

  1. //Gson.class
  2. Gson(final Excluder excluder, final FieldNamingStrategy fieldNamingStrategy,
  3. final Map> instanceCreators, boolean serializeNulls,
  4. boolean complexMapKeySerialization, boolean generateNonExecutableGson, boolean htmlSafe,
  5. boolean prettyPrinting, boolean lenient, boolean serializeSpecialFloatingPointValues,
  6. LongSerializationPolicy longSerializationPolicy, String datePattern, int dateStyle,
  7. int timeStyle, List builderFactories,
  8. List builderHierarchyFactories,
  9. List factoriesToBeAdded) {
  10. //排除器,在序列化对象的时候会根据使用者设置的规则排除一些数据
  11. //排除策略需要使用者自行实现 ExclusionStrategy 接口来制定
  12. this.excluder = excluder;
  13. //fieldNamingStrategy 负责命名规则的确定(比如 大驼峰命名、小驼峰命名、下划线命名 等)
  14. //选择不同的 fieldNamingStrategy 会在输出 json 字符串的时候把字段名称转成不同的命名形式
  15. //此处的值可以直接选择 FieldNamingPolicy 枚举类中的已经存储的策略,也可以自行实现 FieldNamingStrategy 接口
  16. //此处默认为 FieldNamingPolicy.IDENTITY,即不改变
  17. this.fieldNamingStrategy = fieldNamingStrategy;
  18. //instanceCreators 是一个用来存储实现了 InstanceCreator 接口的对象的 map
  19. //每一个 InstanceCreator 的实现类用来反射获取一种特定类型的 bean 对象
  20. //InstanceCreator 在 Gson 中没有实现类,使用者可以自行定制
  21. //此处为空 map
  22. this.instanceCreators = instanceCreators;
  23. //ConstructorConstructor 用来统一调度 instanceCreators
  24. this.constructorConstructor = new ConstructorConstructor(instanceCreators);
  25. //serializeNulls 是一个 boolean 类型的对象,用以表示是否支持空对象的序列化
  26. //此处传入的是 DEFAULT_SERIALIZE_NULLS,值为 false,是一个定义在 Gson 中的常量
  27. this.serializeNulls = serializeNulls;
  28. //将 Map 序列化的过程中,会存在一个问题,即 Map 的 key 值是一个复杂对象(java bean 等)
  29. //如果 complexMapKeySerialization 设置为 false,则直接调用对象的 toString() 方法获取字符串
  30. //设置为 true 的情况下会去尝试解析此对象,一般情况下要配合特定的 TypeAdapter 使用
  31. //默认为 false
  32. this.complexMapKeySerialization = complexMapKeySerialization;
  33. //是否要生成不可执行的 json
  34. //默认为 false
  35. this.generateNonExecutableJson = generateNonExecutableGson;
  36. //是否对 html 进行编码,即对部分符号进行转义(=、<、> 等)
  37. //默认为 true
  38. this.htmlSafe = htmlSafe;
  39. //在输出的时候格式化 json
  40. //默认为 false
  41. this.prettyPrinting = prettyPrinting;
  42. //设置 json 的自定义标准
  43. //默认 false ,即为 json 标准的数据格式
  44. this.lenient = lenient;
  45. //用于支持 float 类型的特殊值,比如 Infinity(无穷大) 或 -Infinity(负无穷大) 等
  46. //默认为 false
  47. this.serializeSpecialFloatingPointValues = serializeSpecialFloatingPointValues;
  48. //设置对 long 类型的变量,是解析成字符串还是解析为 long 类型
  49. //默认为解析成 long 类型
  50. this.longSerializationPolicy = longSerializationPolicy;
  51. //以下三行用于设置日期格式和时间格式
  52. //datePattern 是日期和时间的字符串格式表达,在此处为 null
  53. //dateStyle 与 timeStyle 为日期和时间格式的编码
  54. //以 int 常量形式存放在 java.text.DateFormat 中
  55. //此处均为默认值
  56. //需要注意的是默认情况下 Gson 的日期解析不太符合国人的习惯
  57. this.datePattern = datePattern;
  58. this.dateStyle = dateStyle;
  59. this.timeStyle = timeStyle;
  60. //此处为空
  61. this.builderFactories = builderFactories;
  62. //此处为空
  63. this.builderHierarchyFactories = builderHierarchyFactories;
  64. //TypeAdapter 是一个接口,用于序列化和反序列化某种特定的类型
  65. //TypeAdapterFactory 是 TypeAdapter 的包装类
  66. List factories = new ArrayList();
  67. //TypeAdapters 是 TypeAdapter 和 TypeAdapterFactory 的通用工具类
  68. //处理 JsonElement 类型对象的 TypeAdapterFactory
  69. //JsonElement 是 Gson 工具包中的一个类
  70. factories.add(TypeAdapters.JSON_ELEMENT_FACTORY);
  71. //处理 Object 类型对象的 TypeAdapterFactory
  72. factories.add(ObjectTypeAdapter.FACTORY);
  73. //excluder 是一个省略了类型的 TypeAdapterFactory
  74. //根据官方注释,excluder 需要先于所有使用者自定义的 TypeAdapterFactory 去执行
  75. factories.add(excluder);
  76. //使用者自定义的 TypeAdapterFactory
  77. factories.addAll(factoriesToBeAdded);
  78. //处理 String 类型对象的 TypeAdapterFactory
  79. factories.add(TypeAdapters.STRING_FACTORY);
  80. //处理 Integer / int 类型对象的 TypeAdapterFactory
  81. factories.add(TypeAdapters.INTEGER_FACTORY);
  82. //处理 Boolean / boolean 类型对象的 TypeAdapterFactory
  83. factories.add(TypeAdapters.BOOLEAN_FACTORY);
  84. //处理 Byte / byte 类型对象的 TypeAdapterFactory
  85. factories.add(TypeAdapters.BYTE_FACTORY);
  86. //处理 Short / short 类型对象的 TypeAdapterFactory
  87. factories.add(TypeAdapters.SHORT_FACTORY);
  88. //处理 Long / long 类型对象的 TypeAdapterFactory
  89. TypeAdapter longAdapter = longAdapter(longSerializationPolicy);
  90. factories.add(TypeAdapters.newFactory(long.class, Long.class, longAdapter));
  91. //处理 Double / double 类型对象的 TypeAdapterFactory
  92. factories.add(TypeAdapters.newFactory(double.class, Double.class,
  93. doubleAdapter(serializeSpecialFloatingPointValues)));
  94. //处理 Float / float 类型对象的 TypeAdapterFactory
  95. factories.add(TypeAdapters.newFactory(float.class, Float.class,
  96. floatAdapter(serializeSpecialFloatingPointValues)));
  97. //处理 Number 类型对象的 TypeAdapterFactory
  98. factories.add(TypeAdapters.NUMBER_FACTORY);
  99. //处理 AtomicInteger 类型对象的 TypeAdapterFactory
  100. factories.add(TypeAdapters.ATOMIC_INTEGER_FACTORY);
  101. //处理 AtomicBoolean 类型对象的 TypeAdapterFactory
  102. factories.add(TypeAdapters.ATOMIC_BOOLEAN_FACTORY);
  103. //处理 AtomicBoolean 类型对象的 TypeAdapterFactory
  104. factories.add(TypeAdapters.newFactory(AtomicLong.class, atomicLongAdapter(longAdapter)));
  105. //处理 AtomicLongArray 类型对象的 TypeAdapterFactory
  106. factories.add(TypeAdapters.newFactory(AtomicLongArray.class, atomicLongArrayAdapter(longAdapter)));
  107. //处理 AtomicIntegerArray 类型对象的 TypeAdapterFactory
  108. factories.add(TypeAdapters.ATOMIC_INTEGER_ARRAY_FACTORY);
  109. //处理 Character / char 类型对象的 TypeAdapterFactory
  110. factories.add(TypeAdapters.CHARACTER_FACTORY);
  111. //处理 StringBuilder 类型对象的 TypeAdapterFactory
  112. factories.add(TypeAdapters.STRING_BUILDER_FACTORY);
  113. //处理 StringBuffer 类型对象的 TypeAdapterFactory
  114. factories.add(TypeAdapters.STRING_BUFFER_FACTORY);
  115. //处理 BigDecimal 类型对象的 TypeAdapterFactory
  116. factories.add(TypeAdapters.newFactory(BigDecimal.class, TypeAdapters.BIG_DECIMAL));
  117. //处理 BigInteger 类型对象的 TypeAdapterFactory
  118. factories.add(TypeAdapters.newFactory(BigInteger.class, TypeAdapters.BIG_INTEGER));
  119. //处理 URL 类型对象的 TypeAdapterFactory
  120. //java.net.URL
  121. factories.add(TypeAdapters.URL_FACTORY);
  122. //处理 URI 类型对象的 TypeAdapterFactory
  123. //java.net.URI
  124. factories.add(TypeAdapters.URI_FACTORY);
  125. //处理 UUID 类型对象的 TypeAdapterFactory
  126. factories.add(TypeAdapters.UUID_FACTORY);
  127. //处理 Currency 类型对象的 TypeAdapterFactory
  128. factories.add(TypeAdapters.CURRENCY_FACTORY);
  129. //处理 Locale 类型对象的 TypeAdapterFactory
  130. factories.add(TypeAdapters.LOCALE_FACTORY);
  131. //处理 InetAddress 类型对象的 TypeAdapterFactory
  132. //java.net.InetAddress
  133. factories.add(TypeAdapters.INET_ADDRESS_FACTORY);
  134. //处理 BitSet 类型对象的 TypeAdapterFactory
  135. factories.add(TypeAdapters.BIT_SET_FACTORY);
  136. //处理 Date 类型对象的 TypeAdapterFactory
  137. //java.util.Date
  138. factories.add(DateTypeAdapter.FACTORY);
  139. //处理 Calendar 类型对象的 TypeAdapterFactory
  140. factories.add(TypeAdapters.CALENDAR_FACTORY);
  141. //处理 Time 类型对象的 TypeAdapterFactory
  142. factories.add(TimeTypeAdapter.FACTORY);
  143. //处理 Date 类型对象的 TypeAdapterFactory
  144. //java.sql.Date
  145. factories.add(SqlDateTypeAdapter.FACTORY);
  146. //处理 Timestamp 类型对象的 TypeAdapterFactory
  147. factories.add(TypeAdapters.TIMESTAMP_FACTORY);
  148. //处理 Array 类型对象的 TypeAdapterFactory
  149. factories.add(ArrayTypeAdapter.FACTORY);
  150. //处理 Class 类型对象的 TypeAdapterFactory
  151. factories.add(TypeAdapters.CLASS_FACTORY);
  152. //处理 Collection 类型对象的 TypeAdapterFactory
  153. factories.add(new CollectionTypeAdapterFactory(constructorConstructor));
  154. //处理 Map 类型对象的 TypeAdapterFactory
  155. //会受到 complexMapKeySerialization 的影响
  156. factories.add(new MapTypeAdapterFactory(constructorConstructor, complexMapKeySerialization));
  157. //处理 JsonAdapter 类型对象的 TypeAdapterFactory
  158. //JsonAdapter 是一个 Gson 中的注解
  159. this.jsonAdapterFactory = new JsonAdapterAnnotationTypeAdapterFactory(constructorConstructor);
  160. factories.add(jsonAdapterFactory);
  161. //处理 Enum 类型对象的 TypeAdapterFactory
  162. factories.add(TypeAdapters.ENUM_FACTORY);
  163. //反射分解对象的 TypeAdapterFactory
  164. factories.add(new ReflectiveTypeAdapterFactory(
  165. constructorConstructor, fieldNamingStrategy, excluder, jsonAdapterFactory));
  166. this.factories = Collections.unmodifiableList(factories);
  167. }

从这里可以看出,Gson 的初始化时期提供了非常丰富的设置选项。

2 GsonBuilder

设置 Gson 的这些选项需要通过 GsonBuilder :

</>复制代码

  1. Gson gson = new GsonBuilder()
  2. //以下方法均为设置 excluder
  3. //设置版本号
  4. .setVersion(1)
  5. //设置忽略某种修饰词修饰的变量
  6. //此处忽略 protected 修饰的变量
  7. .excludeFieldsWithModifiers(Modifier.PROTECTED)
  8. //设置使用 Expose 注解,用于忽略某个字段
  9. //默认情况下是不使用 Expose 注解的
  10. .excludeFieldsWithoutExposeAnnotation()
  11. //设置不序列化内部类
  12. .disableInnerClassSerialization()
  13. //批量添加序列化时使用的排除策略
  14. //此方法为不定参方法
  15. .setExclusionStrategies(exclusionStrategy)
  16. //添加一个序列化时使用的排除策略
  17. .addSerializationExclusionStrategy(exclusionStrategy)
  18. //添加一个反序列化时使用的排除策略
  19. .addDeserializationExclusionStrategy(exclusionStrategy)
  20. //本质上以下三个方法均为设置 TypeAdapter
  21. .registerTypeAdapter(String.class, TypeAdapters.STRING)
  22. .registerTypeAdapterFactory(TypeAdapters.STRING_FACTORY)
  23. .registerTypeHierarchyAdapter(String.class, TypeAdapters.STRING)
  24. //设置 dateStyle、datePattern、timeStyle
  25. .setDateFormat("yyyy-MM-dd HH:mm:ss")
  26. .setDateFormat(DateFormat.DATE_FIELD)
  27. .setDateFormat(DateFormat.DATE_FIELD,DateFormat.AM_PM_FIELD)
  28. //以下两个方法本质上是一样的,均为设置 fieldNamingPolicy 属性
  29. .setFieldNamingPolicy(FieldNamingPolicy.IDENTITY)
  30. .setFieldNamingStrategy(FieldNamingPolicy.IDENTITY)
  31. //设置 complexMapKeySerialization = true
  32. .enableComplexMapKeySerialization()
  33. //设置 longSerializationPolicy = LongSerializationPolicy.STRING
  34. //即 long 类型的数据在序列化的时候会转成 String
  35. .setLongSerializationPolicy(LongSerializationPolicy.STRING)
  36. //设置 serializeNulls = true
  37. .serializeNulls()
  38. //设置 prettyPrinting = true
  39. .setPrettyPrinting()
  40. //设置 generateNonExecutableJson = true
  41. .generateNonExecutableJson()
  42. //设置 lenient = true
  43. .setLenient()
  44. //设置 escapeHtmlChars = false
  45. .disableHtmlEscaping()
  46. //设置 serializeSpecialFloatingPointValues = true
  47. .serializeSpecialFloatingPointValues()
  48. //创建解析器对象
  49. .create();
3 Excluder

在上述设置中,有一大块是关于排除器 excluder 的设置。excluder 的实现逻辑依赖 ExclusionStrategy 的自定义实现类,追踪一下 ExclusionStrategy 接口:

</>复制代码

  1. //实现
  2. public interface ExclusionStrategy {
  3. //设置忽略的变量,需要传入 FieldAttributes
  4. //FieldAttributes 是在 Gson 中定义的 Field 的包装类
  5. public boolean shouldSkipField(FieldAttributes f);
  6. //设置要忽略的 class
  7. public boolean shouldSkipClass(Class clazz);
  8. }

fieldNamingPolicy 则需要 FieldNamingStrategy 的自定义实现类,追踪一下 FieldNamingStrategy 接口:

</>复制代码

  1. public interface FieldNamingStrategy {
  2. //在这个方法中实现自定义的命名规则
  3. public String translateName(Field f);
  4. }

FieldNamingPolicy 是一个实现了 FieldNamingStrategy 接口的枚举类,其中实现了多套 translateName(...) 方法可供选择。

二 TypeAdapter 和 TypeAdapterFactory

在 Gson 中封装了不同类型的读写的业务组装类是各个 TypeAdapter(适配器),这里先来关注一下其具体实现。

1 父类与接口

先来看一下 TypeAdapterFactory 接口:

</>复制代码

  1. public interface TypeAdapterFactory {
  2. //只有一个方法,用于根据解析器和变量类型来创建 TypeAdapter
  3. TypeAdapter create(Gson gson, TypeToken type);
  4. }

再来看一下 TypeAdapter 抽象类:

</>复制代码

  1. public abstract class TypeAdapter {
  2. //写入方法,主要的指挥 JsonWriter 进行业务处理
  3. public abstract void write(JsonWriter out, T value) throws IOException;
  4. //读取方法,主要是指挥 JsonReader 进行业务操作
  5. public abstract T read(JsonReader in) throws IOException;
  6. //该抽象类中还提供了其它的方法,在此例中没有用到,暂时忽略
  7. }
2 StringTypeAdapter

关注一下下列这行代码:

</>复制代码

  1. factories.add(TypeAdapters.STRING_FACTORY);

factories 是一个列表,来追踪一下 TypeAdapters.STRING_FACTORY :

</>复制代码

  1. //TypeAdapters.class
  2. public static final TypeAdapterFactory STRING_FACTORY = newFactory(String.class, STRING);

先来看一下定义在 TypeAdapters 中的 STRING 变量:

</>复制代码

  1. //TypeAdapters.class
  2. public static final TypeAdapter STRING = new TypeAdapter() {
  3. //此方法用于反序列化时读取值
  4. @Override
  5. public String read(JsonReader in) throws IOException {
  6. //in.peek() 方法会获取到最新的 JsonReader 操作指令,并转换成下一个要操作的字符类型
  7. //在后面的 part 里还会提到
  8. JsonToken peek = in.peek();
  9. //读取到 null
  10. if (peek == JsonToken.NULL) {
  11. in.nextNull();
  12. return null;
  13. }
  14. //读取到 boolean 类型的值
  15. if (peek == JsonToken.BOOLEAN) {
  16. return Boolean.toString(in.nextBoolean());
  17. }
  18. //除了 null 和 boolean 之外,都视作 String 进行返回
  19. return in.nextString();
  20. }
  21. //此方法用于序列化时写入值
  22. @Override
  23. public void write(JsonWriter out, String value) throws IOException {
  24. out.value(value);
  25. }
  26. };

继续追踪 newFactory(...) 方法:

</>复制代码

  1. //TypeAdapters.class
  2. public static TypeAdapterFactory newFactory(final Class type, final TypeAdapter typeAdapter) {
  3. return new TypeAdapterFactory() {
  4. @SuppressWarnings("unchecked")
  5. @Override
  6. public TypeAdapter create(Gson gson, TypeToken typeToken) {
  7. //typeToken.getRawType() 会获取到这个 TypeToken 所需要的
  8. return typeToken.getRawType() == type ? (TypeAdapter) typeAdapter : null;
  9. }
  10. //常规的重新 toString() 方法
  11. @Override
  12. public String toString() {
  13. return "Factory[type=" + type.getName() + ",adapter=" + typeAdapter + "]";
  14. }
  15. };
  16. }

从这里可以看出,TypeAdapterFactory 本质上只是 TypeAdapter 的包装类,只是做一个类型的判定工作,如果判定为相同,就会返回传入的 TypeAdapter。

一般的类型的 TypeAdpter 的操作逻辑都比较类似,不赘述了。

2 ReflectiveTypeAdapter

对于一般的自定义类,比如使用者自定义的 java bean 等,并非 jdk 自带的基本数据类型,就都需要 ReflectiveTypeAdapter 来进行解析。

先来看一下 ReflectiveTypeAdapterFactory 的 create() 方法:

</>复制代码

  1. //ReflectiveTypeAdapterFactory.class
  2. public TypeAdapter create(Gson gson, final TypeToken type) {
  3. Class raw = type.getRawType();
  4. //要确保 type 中获取出来的 class 的类型是 Object 的子类
  5. //如果不是的话就代表这是基本类型,基本类型的解析不应该使用该适配器
  6. //所以返回 null
  7. if (!Object.class.isAssignableFrom(raw)) {
  8. return null;
  9. }
  10. //constructor 用于反射创建对象
  11. ObjectConstructor constructor = constructorConstructor.get(type);
  12. //Adapter 是 ReflectiveTypeAdapterFactory 的静态内部类,继承了 TypeAdapter
  13. return new Adapter(constructor, getBoundFields(gson, type, raw));
  14. }

来继续追踪一下 Adapter 的主要方法:

</>复制代码

  1. public static final class Adapter extends TypeAdapter {
  2. //此处 read(...) 和 write(...) 的代码比较类似
  3. //主要步骤是通过反射创建出对象,并抓取其所有的变量,逐个存入
  4. public T read(JsonReader in) throws IOException {
  5. if (in.peek() == JsonToken.NULL) {
  6. in.nextNull();
  7. return null;
  8. }
  9. //调用构造器反射创建出对象
  10. T instance = constructor.construct();
  11. //以下代码是 Gson 读出字符串中的部分,并用反射填入到对象中的过程
  12. try {
  13. in.beginObject();
  14. while (in.hasNext()) {
  15. String name = in.nextName();
  16. //BoundField 是 Gson 对 jdk 中的 Field 类的增强
  17. BoundField field = boundFields.get(name);
  18. if (field == null || !field.deserialized) {
  19. in.skipValue();
  20. } else {
  21. field.read(in, instance);
  22. }
  23. }
  24. } catch (IllegalStateException e) {
  25. throw new JsonSyntaxException(e);
  26. } catch (IllegalAccessException e) {
  27. throw new AssertionError(e);
  28. }
  29. in.endObject();
  30. return instance;
  31. }
  32. public void write(JsonWriter out, T value) throws IOException {
  33. if (value == null) {
  34. out.nullValue();
  35. return;
  36. }
  37. out.beginObject();
  38. //以下是 Gson 从对象中获取到数据并写成字符串的过程
  39. try {
  40. for (BoundField boundField : boundFields.values()) {
  41. if (boundField.writeField(value)) {
  42. out.name(boundField.name);
  43. boundField.write(out, value);
  44. }
  45. }
  46. } catch (IllegalAccessException e) {
  47. throw new AssertionError(e);
  48. }
  49. out.endObject();
  50. }
  51. }

具体的步骤其实是对 java 反射的深度定制化应用,不展开了。

以上过程在 JsonReader 和 JsonWriter 的应用中会有类似展开。至于 JsonReader 和 JsonWriter 会在后续进行追踪。

To Be Continued ...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72824.html

相关文章

  • 追踪解析Gson源码(2)

    摘要:接上篇三和在进行的序列化和反序列化源码解析之前先了解一下其主体工具类。是中用于序列化的主体。同时为了兼顾性能做了很多有意思的设计,比如获取适配器的时候的双缓存设计,应该是为了提高解析器的复用效率,具体有待研究。 接上篇 三 JsonReader 和 JsonWriter 在进行 json 的序列化和反序列化源码解析之前先了解一下其主体工具类。 1 JsonReader JsonRead...

    shiguibiao 评论0 收藏0
  • 追踪解析 ThreadPoolExecutor 源码

    摘要:的前位数用来表示线程的数量,后面三位用来表示线程池的状态。线程池的状态有五种,分别是,根据单词就能猜出大概。并且为了考虑性能问题,线程池的设计没有使用悲观锁关键字,而是大量使用了和机制。 零 前期准备 0 FBI WARNING 文章异常啰嗦且绕弯。 1 版本 JDK 版本 : OpenJDK 11.0.1 IDE : idea 2018.3 2 ThreadPoolExecutor ...

    gaomysion 评论0 收藏0
  • Retrofit源码分析

    摘要:看下图所示,摘自网络的创建流程源码分析实例是使用建造者模式通过类进行创建的。创建了一个含有对象实例的,并返回给源码分析添加一个调用适配器工厂,用于支持服务方法返回类型注意生产的是,那么又是什么呢可以看到源代码如下所示,它是一个接口。 目录介绍 1.首先回顾Retrofit简单使用方法 2.Retrofit的创建流程源码分析 2.1 Retrofit对象调用Builder()源码解...

    zero 评论0 收藏0
  • gson-plugin深入源码分析(三)

    摘要:六修改内部类的方法这个的方法是对类型的数据进行解析,我们判断输入的数据类型不是类型,就直接跳过解析,核心是在方法中插入方法。每一个类每一个内部类每一个匿名内部类,都会生成一个独立的文件,如。 一、项目地址 项目地址:github-gson-plugin 二、ReaderTools解析 /** * Created by tangfuling on 2018/10/23. */ pu...

    oujie 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<