用途

在使用fastJson时,对于泛型的反序列化很多场景下都会使用到TypeReference,例如:

void testTypeReference() {List<Integer> list = new ArrayList<>();list.add(1);list.add(9);list.add(4);list.add(8);JSONObject jsonObj = new JSONObject();jsonObj.put("a", list);System.out.println(jsonObj);List<String> list2 = jsonObj.getObject("a", new TypeReference<List<Integer>>(){});System.out.println(list2);}

输出

{"a":[1,9,4,8]}
[1, 9, 4, 8]

使用TypeReference可以明确的指定反序列化的类型,具体实现逻辑参考TypeReference的构造函数 

  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;}

解说

其中核心的方法是:getActualTypeArguments,它可以得到父类的反省类型

ParameterizedType是一个记录类型泛型的接口, 继承自Type,一共三方法:

  • Type[] getActualTypeArguments(); //返回泛型类型数组
  • Type getRawType(); //返回原始类型Type
  • Type getOwnerType(); //返回 Type 对象,表示此类型是其成员之一的类型。

例如 Map<String,String> 对应的ParameterizedType三个方法分别取值如下:

  • [class java.lang.String, class java.lang.String]
  • interface java.util.Map
  • null

例证

package JsonLearn;import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;public class TypeReferencBaseLearn {public static class IntMap extends HashMap<String, Integer> {}void test1() {IntMap intMap = new IntMap();System.out.println("getSuperclass:" + intMap.getClass().getSuperclass());System.out.println("getGenericSuperclass:" + intMap.getClass().getGenericSuperclass());Type type = intMap.getClass().getGenericSuperclass();if (type instanceof ParameterizedType) {ParameterizedType p = (ParameterizedType)type;for (Type t : p.getActualTypeArguments()) {System.out.println(t);}}}void test2() {Map<String, Integer> intMap = new HashMap<>();System.out.println("\ngetSuperclass:" + intMap.getClass().getSuperclass());System.out.println("getGenericSuperclass:" + intMap.getClass().getGenericSuperclass());Type type = intMap.getClass().getGenericSuperclass();if (type instanceof ParameterizedType) {ParameterizedType p = (ParameterizedType)type;for (Type t : p.getActualTypeArguments()) {System.out.println(t);}}}void test3() {Map<String, Integer> intMap = new HashMap<String, Integer>(){};System.out.println("\ngetSuperclass:" + intMap.getClass().getSuperclass());System.out.println("getGenericSuperclass:" + intMap.getClass().getGenericSuperclass());Type type = intMap.getClass().getGenericSuperclass();if (type instanceof ParameterizedType) {ParameterizedType p = (ParameterizedType)type;for (Type t : p.getActualTypeArguments()) {System.out.println(t);}}}public static void main(String[] args) {TypeReferencBaseLearn obj = new TypeReferencBaseLearn();obj.test1();obj.test2();obj.test3();}
}

输出

getSuperclass:class java.util.HashMap
getGenericSuperclass:java.util.HashMap<java.lang.String, java.lang.Integer>
class java.lang.String
class java.lang.IntegergetSuperclass:class java.util.AbstractMap
getGenericSuperclass:java.util.AbstractMap<K, V>
K
VgetSuperclass:class java.util.HashMap
getGenericSuperclass:java.util.HashMap<java.lang.String, java.lang.Integer>
class java.lang.String
class java.lang.Integer 

注意区分test3()中的:

Map<String, Integer> intMap = new HashMap<String, Integer>(){};

而不是

Map<String, Integer> intMap = new HashMap<String, Integer>;

后者是test2()

转载于:https://www.cnblogs.com/kaituorensheng/p/9804097.html

java为什么使用TypeReference相关推荐

  1. java referencemap_Java中TypeReference用法说明

    来源于:https://blog.csdn.net/zhuzj12345/article/details/102914545 在使用fastJson时,对于泛型的反序列化很多场景下都会使用到TypeR ...

  2. java 获取泛型_Java泛型 | Jackson TypeReference获取泛型类型信息

    前言 Jackson是一个比较流行的Json序列化和反序列化框架.本文以Jackson为例介绍TypeReference实现涉及泛型的反序列化,及TypeReference的实现原理.对于获取泛型类型 ...

  3. java typereference_记录一下jackson中TypeReference的使用

    今天在看到项目中有一段代码是将string字符串转化成对象,需要被转化成对象的类加了TypeReference,随即去百度了下. TypeReference是一个抽象类,继承了Comparable接口 ...

  4. 【java】Java中TypeReference用法说明

    1.概述 TypeReference用途 在使用FastJson时,对于泛型的反序列化很多场景下都会使用到TypeReference,例如: void testTypeReference() {Lis ...

  5. Java的List和Json转换以及StringRedisTemplate往redis存泛型对象

    List转Json List<User> user= new ArrayList(); String str = JSON.toJSONString(user); Json 转List方法 ...

  6. java代码中fastjson生成字符串和解析字符串的方法和javascript文件中字符串和json数组之间的转换方法...

    1.java代码中fastjson生成字符串和解析字符串的方法 List<TemplateFull> templateFulls = new ArrayList<TemplateFu ...

  7. 如何避免Java中的回调“地狱”

    来自:锅外的大佬 本篇文章将简要介绍进行同步远程调用所涉及的代码类型.然后,我们将演示非阻塞 IO 中的分层如何高效使用资源(尤其是线程),引入了称为回调地狱带来的复杂性以及基于反应流方法如何简化编程 ...

  8. java 动态解析_Java 如何解析key为动态的json操作

    遇到了这样的json串: "panel": { "8": { "112": 1 }, "11": { "147 ...

  9. Exception in thread http-bio-80exec-1 java.lang.OutOfMemoryError: PermGen s解决方案

    问题描述: Exception in thread ""http-bio-80"-exec-1" java.lang.OutOfMemoryError: Per ...

  10. java如何监听以太坊交易

    2019独角兽企业重金招聘Python工程师标准>>> 你可以在web3j库的帮助下使用java轻松监听以太坊交易,但此库无法监听Erc20 Token交易. 要监听Erc20Tok ...

最新文章

  1. 高性能 Java 应用层网关设计实践
  2. python投资组合
  3. hihocoder编程练习赛75
  4. [转]100个常用的linux命令
  5. python自学网站有哪些-Python自学之路-前期准备
  6. CentOS通过日志反查入侵(转)
  7. 国产操作系统进入被彻底抛弃的时代
  8. 并查集路径压缩_并查集(UnionFind)技巧总结
  9. Android之在window下面开发常用的adb命令(不断更新)
  10. 解决:Navicat for mysql 设置外键出错
  11. 当微服务遇上 Serverless | 微服务容器化最短路径,微服务 on Serverless 最佳实践
  12. spring2.5.4+hibernate3.2.6+struts2+jbpm3.2.2
  13. java解析xml文件失败,在Java中解析大型XML文件时找不到文件异常
  14. go语言阶段综合练习--家庭收支软件的示例--过程版本
  15. php输入一个字符串 输出所有组合,C++_C语言实现输入一个字符串后打印出该字符串中字符的所有排列,本文实例讲述了C语言实现输入 - phpStudy...
  16. 安卓版的水经注地图_水经注万能地图下载器
  17. Go语言实战抽奖系统
  18. Zint生成多种条码及二维码
  19. 对程序员而言,学历重要吗?
  20. 苹果电脑带有双系统Mac/Win,如何更改默认启动系统?

热门文章

  1. IS-IS详解(七)——IS-IS LSP报文详解
  2. 防火墙虚拟系统互访配置实例
  3. Java 中时间处理SimpleDateFormat 中HH和hh的区别
  4. 线程同步:喂,SHE
  5. 冰点密码忘记了怎么办
  6. Add NIC to Openfiler 2.3
  7. 调用iphone客户端进行授权发微博的方法--使用友盟组件
  8. cisco 设备的NTP客户端设置
  9. Configure universal group membership caching
  10. mysql base64的编码与解码