系列文章目录
文章目录
- 系列文章目录
- 一、简介
- 二、构造方法
一、简介
com.alibaba.fastjson.TypeReference 即类型引用,用于指定我们使用 com.alibaba.fastjson 进行 json 转换时的对象类型。
官方解释:
表示泛型的类型。Java 还没有提供表示泛型类型的方法,所以这个类提供了。强制客户端创建该类的子类,使其即使在运行时也能检索类型信息。
例如,要为 List 创建类型文本,您可以创建一个空的匿名内部类:
TypeReference<List> list = new TypeReference<List>() {};
此语法不能用于创建具有通配符参数的类型字面值,Class<?> 或 List<? extends CharSequence>。
目的是用于在 json 转换为泛型时,指定泛型的类型,以便能够正确的将 json 数据正确设置到实际的类对象中。
因为当转换的对象是泛型时,我们无法获取到实际的类,也无法获取到类的变量,也就无法获取到类变量的 get、set 方法,所以我们无法将这个 json 数据转换到某一个实际的类对象中存储,所以转换后仅仅是以 map 的 key-value 形式存储。
这样就存在一个问题,当我们以正常的对象方式来访问对象的变量时,就会抛出 json 转换异常。
二、构造方法
官方解释:
构造一个新的类型。从类型参数派生表示的类。
客户端创建一个空的匿名子类。这样做会将类型参数嵌入到匿名类的类型层次结构中,这样我们就可以在运行时重新构建它,而不用进行擦除。
protected TypeReference(){Type superClass = getClass().getGenericSuperclass();Type type = ((ParameterizedType) superClass).getActualTypeArguments()[0];Type cachedType = classTypeCache.get(type);if (cachedType == null) {classTypeCache.putIfAbsent(type, type);cachedType = classTypeCache.get(type);}this.type = cachedType;
}
首先,在构造方法中通过反射获取到当前对象的 Class 类,并获取到其直接父类。然后获取到直接父类的实际类型参数。然后将该实际类型放到 ConcurrentHashMap 类型的 classTypeCache 类型缓存 map 中,并设置到当前 TypeReference 对象的类型变量中。