java为什么使用TypeReference
用途
在使用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相关推荐
- java referencemap_Java中TypeReference用法说明
来源于:https://blog.csdn.net/zhuzj12345/article/details/102914545 在使用fastJson时,对于泛型的反序列化很多场景下都会使用到TypeR ...
- java 获取泛型_Java泛型 | Jackson TypeReference获取泛型类型信息
前言 Jackson是一个比较流行的Json序列化和反序列化框架.本文以Jackson为例介绍TypeReference实现涉及泛型的反序列化,及TypeReference的实现原理.对于获取泛型类型 ...
- java typereference_记录一下jackson中TypeReference的使用
今天在看到项目中有一段代码是将string字符串转化成对象,需要被转化成对象的类加了TypeReference,随即去百度了下. TypeReference是一个抽象类,继承了Comparable接口 ...
- 【java】Java中TypeReference用法说明
1.概述 TypeReference用途 在使用FastJson时,对于泛型的反序列化很多场景下都会使用到TypeReference,例如: void testTypeReference() {Lis ...
- Java的List和Json转换以及StringRedisTemplate往redis存泛型对象
List转Json List<User> user= new ArrayList(); String str = JSON.toJSONString(user); Json 转List方法 ...
- java代码中fastjson生成字符串和解析字符串的方法和javascript文件中字符串和json数组之间的转换方法...
1.java代码中fastjson生成字符串和解析字符串的方法 List<TemplateFull> templateFulls = new ArrayList<TemplateFu ...
- 如何避免Java中的回调“地狱”
来自:锅外的大佬 本篇文章将简要介绍进行同步远程调用所涉及的代码类型.然后,我们将演示非阻塞 IO 中的分层如何高效使用资源(尤其是线程),引入了称为回调地狱带来的复杂性以及基于反应流方法如何简化编程 ...
- java 动态解析_Java 如何解析key为动态的json操作
遇到了这样的json串: "panel": { "8": { "112": 1 }, "11": { "147 ...
- Exception in thread http-bio-80exec-1 java.lang.OutOfMemoryError: PermGen s解决方案
问题描述: Exception in thread ""http-bio-80"-exec-1" java.lang.OutOfMemoryError: Per ...
- java如何监听以太坊交易
2019独角兽企业重金招聘Python工程师标准>>> 你可以在web3j库的帮助下使用java轻松监听以太坊交易,但此库无法监听Erc20 Token交易. 要监听Erc20Tok ...
最新文章
- 高性能 Java 应用层网关设计实践
- python投资组合
- hihocoder编程练习赛75
- [转]100个常用的linux命令
- python自学网站有哪些-Python自学之路-前期准备
- CentOS通过日志反查入侵(转)
- 国产操作系统进入被彻底抛弃的时代
- 并查集路径压缩_并查集(UnionFind)技巧总结
- Android之在window下面开发常用的adb命令(不断更新)
- 解决:Navicat for mysql 设置外键出错
- 当微服务遇上 Serverless | 微服务容器化最短路径,微服务 on Serverless 最佳实践
- spring2.5.4+hibernate3.2.6+struts2+jbpm3.2.2
- java解析xml文件失败,在Java中解析大型XML文件时找不到文件异常
- go语言阶段综合练习--家庭收支软件的示例--过程版本
- php输入一个字符串 输出所有组合,C++_C语言实现输入一个字符串后打印出该字符串中字符的所有排列,本文实例讲述了C语言实现输入 - phpStudy...
- 安卓版的水经注地图_水经注万能地图下载器
- Go语言实战抽奖系统
- Zint生成多种条码及二维码
- 对程序员而言,学历重要吗?
- 苹果电脑带有双系统Mac/Win,如何更改默认启动系统?