在上一篇博客中笼统的介绍了Gson中解析json的整体流程,但是具体细节并没有说明,本篇就简单的梳理一下: 1)怎么利用反射来创建自定义的JavaBean? 2)怎么给JavaBen的变量类来赋值? 3)集合类对象怎么创建?
通过阅读Gson源码可得出以下的结论: 1)先 获取type获取JavaBean的java.lang.reflect.Constructor,构造器为默认构造器 2)通过Constructor的newInstance()来创建一个type类型的JavaBean对象。 3)循环遍历json中的键值对,获取key和value;并且获取key对应的JavaBean中的Field 4)将value通过Filed的set(JavaBean,value)方法,将value赋值给Javaben对应的Field中去
实例代码如下:
Constructor c = Person.class.getDeclaredConstructor();
Person person=(Personn) c.newInstance();
//获取Person中的变量
Field[] fields = Person.class.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
//获取变量名
String name = field.getName();
if (name.equals("name"){
field.set(person, "凌云");
} else if (name.equals("sex")) {
field.set(person, "屌丝男");
} else if(name.equals("job")){
field.set(person,"IT monkey");
}
}
return person
上面的例子程序可以说是Gson中对json解析的简单雏形,其实这些结论都是Gson对于Java反射知识的基本应用,只不过在用的时候结合泛型做了有效的封装来进行通用。下面就简单的梳理一下Gson是怎么来进行处理的。 1)json串键值对key/value中key绑定JavaBean中对应的变量。(本节假设JavaBean中便令名没有用到注解), 在Gson中创建了一个BoundField的类,该类就是负责json中key与JavaBean的变量名进行映射绑定:
//
private final Map boundFields;
//该类在ReflectiveTypeAdapterFactory中定义
static abstract class BoundField {
//json的key或者JavaBean中的变量名
final String name;
......
protected BoundField(String name, boolean serialized, boolean deserialized) {
this.name = name;
this.serialized = serialized;
this.deserialized = deserialized;
}
在ReflectiveTypeAdapterFactory类中通过getBoundFields方法来对boundFields(详见Gson的反射解析机制详解(1)这个map进行初始化,主要是循环遍历JavaBean中的变量,然后把每个变量封装成一个BoundField,放入map中.该map的key对应的是JavaBean的变量名,value对应的就是BoundField。而BoundField还负责对其绑定的JavaBean变量或者json中key进行读取解析,然后赋值给该JavaBean变量,通过Field的set(JavaBean,value)来完成(这部分详见Gson的反射解析机制详解(1) )。.方法基本的骨架跟文章开头类似。
2)步骤1)中提到,最终是通过Field.setValue(JavaBean,value)来完成当前变量的赋值操作,方法参数中value我们知道是通过读取json来获取,而第一个参数JavaBean是怎么创建的?答案是通过反射创建Gson 的TypeToken 中T代表的对象,也就是JavaBean对象。具体的就是用Constructor.newInstance();见文章开头实例方法:但在Gson中是通过ConstructorConstructor这个类来完成这一工作的:该类提供了newDefaultConstructor来获取JavaBean中的默认构造器,并通过该构造器创建一个JavaBean对象:
private ObjectConstructor newDefaultConstructor(Class
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?