从fastjson的TypeReference用法,推导如何实现泛型反射

1.fastjson带泛型反序列化的用法

fastjson

 

2.我们来看看TypeReference的源码是什么

从fastjson的TypeReference用法,推导如何实现泛型反射_第1张图片

TypeReference

* 我们发现TypeReferenced的构造方法是保护方法,也就是你无法直接实例化,你实例化出来的都是TypeReference的匿名子类
* 在构造方法里面有些我们平常没接触过的东西他们是什么呢?

3.下面我来看看TypeReference构造方法中到底是些什么东西

* 构造方法中第一句,从字面上的意思解释就是获取当前对象的泛型父Class,实际上他的作用也是这样的

Type superClass = this.getClass().getGenericSuperclass();

* 第二句就是获取泛型父Class的泛型参数

this.type = ((ParameterizedType)superClass).getActualTypeArguments()[0];

4.Ok!下面我们通过自己的例子来获取泛型对象的泛型实际参数

     *目的:通过FanDemo获取FanDto泛型类型

第一步够着两个类,一个是实际的泛型对象FanDto,一个是用来获取泛型参数的类FanDemo

从fastjson的TypeReference用法,推导如何实现泛型反射_第2张图片

FanDto

 

从fastjson的TypeReference用法,推导如何实现泛型反射_第3张图片

FanDto

第二步我们获取父泛型类FanDemo

获取FanDemo


输出结果:

 

输出结果

我发现我们已经获取到了泛型父类FanDemo

第三步通过泛型父类获取目的泛型类FanDto
泛型父类类型为ParameterizedType类型,通过getActualTypeArguments获取泛型参数数组

从fastjson的TypeReference用法,推导如何实现泛型反射_第4张图片

获取FanDto

 

输出结果:

输出结果

这个时候我们获取到了我们想要的泛型对象FanDto,接下来我们需要获取FanDto的泛型参数
第四步 获取FanDto的泛型参数T的类型

从fastjson的TypeReference用法,推导如何实现泛型反射_第5张图片

获取泛型参数T

输出结构为:

输出结果

 

这个时候我们得到了FanDto的泛型类型为String,ok 大功告成

最后通过获取泛型对应的字段

从fastjson的TypeReference用法,推导如何实现泛型反射_第6张图片

获取泛型对应的字段

 

输出结果为:

输出结果

注:泛型类型在编译的时候都会别转成Object不会留下任何预设对象的信息,所以必须要通过这种方式才能获取到泛型类型,这数据泛型擦除的内容,这里我就不细讲了


 

你可能感兴趣的:(Java)