java referencemap_Java中TypeReference用法说明

来源于:https://blog.csdn.net/zhuzj12345/article/details/102914545

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

void testTypeReference() {

List 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 list2 = jsonObj.getObject("a", new TypeReference>(){});

System.out.println(list2);

}

输出

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

2[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 对应的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 {}

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

}

}

}

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

class java.lang.String

class java.lang.Integer

getSuperclass:class java.util.AbstractMap

getGenericSuperclass:java.util.AbstractMap

K

V

getSuperclass:class java.util.HashMap

getGenericSuperclass:java.util.HashMap

class java.lang.String

class java.lang.Integer

————————————————

版权声明:本文为CSDN博主「kevin_zhuzj」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/zhuzj12345/article/details/102914545

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zedboard--zynq使用自带外设IP让ARM PS访问FPGA(八) 转载

文章来源 http://blog.chinaaet.com/detail/34609 熟悉了xps的操作&#xff0c;IP添加&#xff0c;总线连接设置&#xff0c;图形化方法检查&#xff08;open graphical design view&#xff09;&#xff0c;检查总线及端口连接。 在file下面的图标中&#xff0c;打开导出到SDK…

[php入门] 4、HTML基础入门一篇概览

[php入门] 1、从安装开发环境环境到&#xff08;庄B&#xff09;做个炫酷的登陆应用 [php入门] 2、基础核心语法大纲 [php入门] 3、WAMP中的集成MySQL相关基础操作 1、HTML的作用   HTML是超文本标记语言&#xff0c;主要用于制作页面结构&#xff1b;而经常与之一起用的CSS是…

Python3 爬虫爬取中国图书网(淘书团) 记录

本人为一名刚开始学Python爬虫的小白&#xff0c;开贴仅为记录下自己的学习历程&#xff0c;方便做review 要爬取链接&#xff1a;http://tuan.bookschina.com/ 要爬取内容&#xff1a; 图书名称&#xff0c; 图书价格&#xff0c; 以及对应预览图的link 本文用到py packages: …

java连接字符串_Java如何连接字符串

Java中的连接是将两个字符串连接在一起的操作。您可以使用加()运算符或String的concat ()方法来连接字符串。使用运算符使用运算符是在Java中连接两个字符串的最常用方法。您可以提供变量&#xff0c;数字或字符串文字(始终用双引号括起来)。例如&#xff0c;要组合字符串“I’…

移动Web应用程序开发HTML5篇

https://software.intel.com/zh-cn/blogs/2012/03/09/webhtml5-offline-web-applications转载于:https://www.cnblogs.com/wln3344/p/4521909.html

分布式之延时任务方案解析

每天学习一点点 编程PDF电子书、视频教程免费下载&#xff1a;http://www.shitanlife.com/code引言 在开发中&#xff0c;往往会遇到一些关于延时任务的需求。例如 生成订单30分钟未支付&#xff0c;则自动取消生成订单60秒后,给用户发短信对上述的任务&#xff0c;我们给一个专…

linux命令学习

Make 命令 http://www.cnblogs.com/peida/tag/%E6%AF%8F%E6%97%A5%E4%B8%80linux%E5%91%BD%E4%BB%A4/ 1 [developmentwww /]$ cd ————直接回到自己的主目录。 2 软件安装步骤 1、configure&#xff0c;这一步一般用来生成 Makefile&#xff0c;为下一步的编译做准备&#…

mysql 搭建日志服务器_一、架构01-搭建日志服务器Rsyslog

搭建日志服务器1、环境配置环境&#xff1a;node01 192.168.32.132 rsyslog服务器node02 192.168.32.128 rsyslog客户端2、node01、node02安装rsyslog软件包[rootnode01 ~]# yum install -y rsyslog[rootnode02 ~]# yum install -y rsyslog3、修改node01上rsyslog的配置文件…

使用了BeanUtils的简单操作

直接获取对象的某个值et.createCell(BeanUtils.getProperty(o, eh.getFieldName())); 简单为对象某个字段赋值c.setCellValue(BeanUtils.getProperty(datas.get(i),headers.get(j).getFieldName())); beanUtils的底层是内省。下面是又一个小例子&#xff0c;实现了map和bean的映…

NTP服务器

随着计算机网络的迅猛发展&#xff0c;网络应用已经非常普遍&#xff0c;众多的领域的网络系统&#xff0c;如电力&#xff0c;石化&#xff0c;金融业&#xff08;证券&#xff0c;银行&#xff09;&#xff0c;广电业&#xff08;广播&#xff0c;电视&#xff09;&#xff0…

ところが

ところが 1表示确定顺接条件&#xff0c;连接两个并存的事项&#xff0c;前项为后项的契机&#xff0c;相当于たら的部分用法  あしたは晴れるだろうと思って寝たが、翌朝起きてみたところ、やっぱり晴れていた。 2表示确定逆接条件&#xff0c;后项往往是与自己的意愿相反的…

mysql 永真_sql注入

Sql注入Sql注入成因&#xff1a;1)转义字符处理不当(如’,--,/**/,会截断原有的语句&#xff0c;执行新语句)&#xff1b;2)类型处理不当(如接受的是整型的参数&#xff0c;并没有校验也可以接受字符型数据)3)查询语句的组装不当4)错误处理不当5)权限配置不当(可以执行高权限语…

吐槽《黑客与画家》

书呆子与骚年 看到本书有关书呆子的描述时&#xff0c;反观自身&#xff0c;有很多感同身受的东西。从小我在大家眼里就是一个安静孤僻的书呆子&#xff0c; 外号“阴天使&#xff08;方言的谐音&#xff09;”。也由于安静的性格&#xff0c;使得我能坐得住安静地读书&#xf…

模板(Template)

最近阅读google chromium base container stack_container代码&#xff0c;深刻感觉到基础知识不扎实。 // Casts the buffer in its right type.T* stack_buffer() { return stack_buffer_.template data_as<T>(); }const T* stack_buffer() const { return stack_buff…

python异常值均值填充_Python 异常值分析

异常值分析是检验数据是否有录入错误以及含有不合常理的数据。忽视异常值的存在是十分危险的&#xff0c;不加剔除地把异常值包括进数据的计算分析过程中&#xff0c;对结果会产生不良影响&#xff1b;重视异常值的出现&#xff0c;分析其产生的原因&#xff0c;常常成为发现问…

近期学习清单

2019独角兽企业重金招聘Python工程师标准>>> 框架 1.编写xml性质的ioc容器demo&#xff08;附上博文一篇&#xff09; 2.编写unity形式的ioc容器demo&#xff08;附上博文一篇&#xff09; 3.编写自己的orm框架 c#语言特性 1.大量阅读有关枚举类&#xff0c;查询类…

java同名函数_浅谈Java 继承接口同名函数问题

在Java中如果一个类同时继承接口A与B&#xff0c;并且这两个接口中具有同名方法&#xff0c;会怎么样&#xff1f;动手做实验&#xff1a;interface A{void fun();}interface B{void fun();}interface C extends A,B{}public class Test implements C{Overridepublic void fun(…

判断两个树是否互相镜像

// 3. 判断两个树是否互相镜像 public static boolean isMirrorRec(TreeNode r1, TreeNode r2){ // 如果两个树都是空树&#xff0c;则返回true if(r1null && r2null){ return true; } // 如果有一棵树是空树&#xff0c;另一颗不是&#xff0c;则返回false if(…

NopCommerce开源项目中很基础但是很实用的C# Helper方法

NopCommerce是啥&#xff1f; nopCommerce是最好的开源电子商务购物 系统。nopCommerce免费提供。今天&#xff0c;它是最好和最流行的ASP.NET电子商务软件。它已被下载超过180万次&#xff01; nopCommerce是一个完全可定制的购物系统。它稳定且高度可用。nopCommerce是一个开…

java中如何设计答题小系统_java的一点问题,设计一个答题的程序

publicclassTestextendsJFrame{privateJPanelt_1newJPanel();privateJPanelt_0newJPanel();privateJLabelj_1newJLabel("题目1.");privateJLabelanwsernewJLabel("");privateButto...public class Test extends JFrame{private JPanel t_1new JPanel();pri…