JSON 序列化与反序列化:使用TypeReference 构建类型安全的异构容器
1. 泛型通常用于集合,如Set和Map等。这样的用法也就限制了每个容器只能有固定数目的类型参数,一般来说,这也确实是我们想要的。
然而有的时候我们需要更多的灵活性,如数据库可以用任意多的Column,如果能以类型安全的方式访问所有Columns就好了,幸运的是
有一种方法可以很容易的做到这一点,就是将key进行参数化,见以下代码
1 public class Favorites {2 private Map<Class<?>, Object> favorites = new HashMap<Class<?>, Object>();3 public <T> void setFavorite(Class<T> klass, T thing) {4 favorites.put(klass, thing);5 }6 public <T> T getFavorite(Class<T> klass) {7 return klass.cast(favorites.get(klass));8 }9 public static void main(String[] args) { 10 Favorites f = new Favorites(); 11 f.setFavorite(String.class, "Java"); 12 f.setFavorite(Integer.class, 0xcafebabe); 13 String s = f.getFavorite(String.class); 14 int i = f.getFavorite(Integer.class); 15 } 16 }
2.不足之处
There is a limitation to this pattern.
//You can't add your favorite List<String> to a Favorites because you simply can't make a type token for a generic type.
f.setFavorite(List<String>.class, Collections.emptyList());
3.改进
import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List;/*** References a generic type.** @author crazybob@google.com (Bob Lee)*/ public abstract class TypeReference<T> {private final Type type;private volatile Constructor<?> constructor;protected TypeReference() {Type superclass = getClass().getGenericSuperclass();if (superclass instanceof Class) {throw new RuntimeException("Missing type parameter.");}this.type = ((ParameterizedType) superclass).getActualTypeArguments()[0];}/*** Instantiates a new instance of {@code T} using the default, no-arg* constructor.*/@SuppressWarnings("unchecked")public T newInstance()throws NoSuchMethodException, IllegalAccessException,InvocationTargetException, InstantiationException {if (constructor == null) {Class<?> rawType = type instanceof Class<?>? (Class<?>) type: (Class<?>) ((ParameterizedType) type).getRawType();constructor = rawType.getConstructor();}return (T) constructor.newInstance();}/*** Gets the referenced type.*/public Type getType() {return this.type;}public static void main(String[] args) throws Exception {List<String> l1 = new TypeReference<ArrayList<String>>() {}.newInstance();List l2 = new TypeReference<ArrayList>() {}.newInstance();} }
参考:
- com.google.common.reflect.TypeToken<T>
- com.fasterxml.jackson.core.type.TypeReference
原文:Super Type Tokens
JSON 序列化与反序列化:使用TypeReference 构建类型安全的异构容器相关推荐
- json 反序列化 父子类型_Jaskson精讲第7篇-类继承关系下的JSON序列化与反序列化JsonTypeInfo...
Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...
- 一文读懂Json序列化与反序列化
一文读懂Json序列化与反序列化 一文读懂Json序列化与反序列化 #mermaid-svg-tVjnnlFu6ZBDpGOQ {font-family:"trebuchet ms" ...
- 当Java泛型擦除遇到JSON序列化和反序列化
当Java泛型类型擦除遇到JSON序列化和反序列化 目录 当Java泛型类型擦除遇到JSON序列化和反序列化 前言 测试 前言 -最近看到了Spring 关于 RestTemplate的源码实现又有了 ...
- DotNet的JSON序列化与反序列化
JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...
- JSON序列化和反序列化还有这种玩法
Mixin对于前端开发者可不陌生,Vue.React等知名前端框架都使用了Mixin.而对于后端开发,尤其是Java后端开发来说Mixin却是一个很陌生的概念.今天来我们通过Jackson让后端开发者 ...
- C#中JSON序列化和反序列化
有一段时间没有到博客园写技术博客了,不过每天逛逛博客园中大牛的博客还是有的,学无止境-- 最近在写些调用他人接口的程序,用到了大量的JSON.XML序列化和反序列化,今天就来总结下json的序列化和反 ...
- Go进阶(7): JSON 序列化和反序列化
1. json序列化和反序列化基础 json数据的序列化和反序列化是一种非常常见的方式,尤其是在http/rcp的微服务调试中. 基础语法 在 Go 中我们主要使用官方的 encoding/json ...
- 序列化对象C++对象的JSON序列化与反序列化探索
新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 一:背景 作为一名C++开发人员,我始终很期待能够像C#与JAVA那样,可以省力的进行对象的序列化与反序列化,但到现在为止,还没有找 ...
- php和js序列化,PHP中serialize和json序列化与反序列化的区别
在PHP中,serialize和json两种方式对一个对象或数组进行序列化或反序列化有什么区别呢? 假设一个对象和一个数组: PHP 1 2 3 4$web=newstdClass; $web-> ...
最新文章
- PackageManagerService详解
- RN pod install 失败(could not find compatible versions for pod “React/Core“)
- MarkdownPad2基础语法
- 各类神经网络知识收集
- 【idea中debug的使用】
- Queue(队列)-Swift实现与广度优先搜索应用
- 移动场景在其缩略图中显示场景中所显示的区域
- Atitit. 软件---多媒体区---- jmf 2.1.1 Java Media Framework 支持的格式
- JVM致命错误日志详解
- 1. 类,对象,对象属性,对象的行为
- 印度人为什么立刀切菜_印度人如何用菜刀,为什么是菜刀不动食材动,与中国完全相反...
- The server time zone value ‘?й???????‘ is unrecognized or represents more than one time zone.
- linux can远程帧,【值得收藏】详解Linux的CAN接口编程技巧
- 视频号拍摄技巧和制作方法有哪些?
- 北航计算机学院吉祥物,北航软件学院吉祥物征集令
- CAD设置命令框的字体
- 华为OD面试——机试算法
- Metasploit技术(四)——进程迁移
- 北京大学计算机专业王腾,王腾-理论与应用地球物理研究所-北大地空学院
- Go 应用的持续性分析
热门文章
- Eclipse安装AmaterasUML
- 史上最全的Linux常用——目录和文件管理命令——收藏这一篇就够了!(超全,超详细)
- Linux内核判断大小端,linux kernel 如何处理大小端
- python程序运行时间计算公式_Python执行时间的计算方法小结
- 手动修改Win7开机欢迎界面背景图片
- System.out.println与System.err.println的区别
- js大屏导出图片_整理了30个实用可视化大屏模板,附源文件+工具
- 使用计算机的优点缺点,计算机使用二进制的优缺点
- java throwable用法_java – ExceptionHandler不能与Throwable一起使用
- 如何成为数据型产品经理