最早接触到Gson是因为项目中有人使用了json,很多项目都会用到。Gson的使用非常方便,不需要关心对象封装了几层,引用了多少list、map在代码里。只要new Gson().tojson(dataObj)就可以了。反过来,new Gson().fromjson(jsonStr, className)可以方便的把json字符串转换成具体对象,简单的让人不敢相信。当然了,还有很多高级的使用技巧(这些技巧一下把我搞懵了),都是“很吓人的技术”。
Gson的转换过程我很好奇,它是如何创建对象的,他怎么知道我是用的是什么类型, 通过接口声明的变量如何初始化 。。。一大堆疑问,促使我转向源码寻找答案。以前使用Argitar开发过测试用例,可以做各种打桩工作,特别神奇的是无论接口还是具体实现,都可以mock出一个对象。当时资料有限,主要通过反编译的方式分析,了解的不是很详细(接口通过动态代理可以实现,具体实现类打桩可以修改class二进制,太高深了)。还有一点就是,jar包经过混淆,文件名和方法名都是a/b/c。。。之类的,看起来很吃力。
现在,我很好奇Gson是否也会修改二进制,它怎么创建对象的。非常幸运,Gson是开源项目,可以下载源码。各种数据类型、对象类型是Gson必须要处理的,首先遇到了TypeToken,从注释来看,Java中对泛型的类型表述不方便,所以增加了TypeToken对业务进行支持。代码里大量使用了Type以及它的子类。Type是java语音的基本概念,之前一直没有听说过(主要是应用开发根本用不到这些)。
/**