java 获取泛型的type,如何获取泛型的Type类型
开发中很多时候都遇到或使用到泛型。例如在json转换成bean对象或其他对象,而对象中存在泛型,这时候需要用到TypeToken。
Type:是java里的 java.lang.reflect.Type;
TypeToken:是guava提供的抽象类能够获取泛型类型
开门见山
通过TypeToken获取泛型Type类型TypeToken typeToken = new TypeToken>>(){};
Type type = typeToken.getType();
举个栗子
例如通过JSON字符串转换成对象 且 还要保持原有类型(包括泛型类型)
1、模拟数据列表//模拟数据列表
List> list = new ArrayList>();
list.add(new User(1,"hello"));
list.add(new User(2,"world"));
String json = JSONArray.toJSONString(list);
System.out.println(json);
//输出:[{"id":1,"name":"hello"},{"id":2,"name":"world"}]
2、不使用TypeToken//我们来看看不使用TypeToken的情况
List> result1 = JSONArray.parseObject(json, list.getClass());
System.out.println(result1);
//输出:[{"id":1,"name":"hello"}, {"id":2,"name":"world"}]
看下图,使用调试看到,执行完result1的时候看到:result1对象为ArrayList,User对象不能正常转化类型为JSONObject,User对象属性变了HashMap了。
3、使用TypeToken//再来看看使用TypeToken的情况
List> result2 = JSONArray.parseObject(json, type);
System.out.println(result2.get(0).getName().getClass());
//输出:[com.weizhixi.test.User@db8155, com.weizhixi.test.User@107f7fe]
//输出:class java.lang.String
再来下图,使用调试看到,执行完result2的时候看到:result2象为ArrayList,User对象已经正常转化类型为User,User对象属性也是对的。
最后
给出完整demo代码
Test.javapackage com.weizhixi.test;
import com.alibaba.fastjson.JSONArray;
import com.google.common.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
/**
* Created by cxq on 2017-11-27.
*/
public class Test {
public static void main(String[] arg0){
//泛型类型
TypeToken typeToken = new TypeToken>>(){};
Type type = typeToken.getType();
//模拟数据列表
List> list = new ArrayList>();
list.add(new User(1,"hello"));
list.add(new User(2,"world"));
String json = JSONArray.toJSONString(list);
System.out.println(json);
//输出:[{"id":1,"name":"hello"},{"id":2,"name":"world"}]
//我们来看看不使用TypeToken的情况
List> result1 = JSONArray.parseObject(json, list.getClass());
System.out.println(result1);
//输出:[{"id":1,"name":"hello"}, {"id":2,"name":"world"}]
//再来看看使用TypeToken的情况
List> result2 = JSONArray.parseObject(json, type);
System.out.println(result2);
System.out.println(result2.get(0).getName().getClass());
//输出:[com.weizhixi.test.User@db8155, com.weizhixi.test.User@107f7fe]
//输出:class java.lang.String
}
}
User.javapackage com.weizhixi.test;
/**
* Created by cxq on 2017-11-27.
*/
public class User{
private Integer id;
private T name;
public User(){
}
public User(Integer id, T name){
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public T getName() {
return name;
}
public void setName(T name) {
this.name = name;
}
}
本例子需使用的jar包有:
fastjson-1.1.41.jar
guava-16.0.1.jar
com.google.guava
guava
16.0.1
com.alibaba
fastjson
1.1.41
获取泛型的类型例子.zip
5060f40b6ca00d5c42c03c26533a581d
已下载:20 次
原创文章,转载请注明出处:https://www.weizhixi.com/article/7.html
java 获取泛型的type,如何获取泛型的Type类型相关推荐
- Java通过Class的对象来获取泛型的class示例
转载自 Java通过Class的对象来获取泛型的class示例 在使用spring的JdbcTemplate实现DAO的时候,经常会用到一个类ParameterizedBeanPropertyRow ...
- java 获取泛型t的class_阿里巴巴都鼎力推荐的java基础之集合其他内容和泛型3
第三节 泛型 3.1为什么需要泛型 没有采用泛型之前 1.不安全:添加元素是无检查 宽进 2.繁琐:获取元素时需要强制类型转换 严出 采用泛型之后 1.安全 严进 2.简单 宽出 3.2什么是泛型ge ...
- 利用反射,泛型,静态方法快速获取表单值到Model。
初级的,很简单,牛人可以不看了.不过还算实用. 在项目中经常需要处理表单,给model赋值,很烦人的一些重复代码.如下边的代码: Code News news = new Ne ...
- Java魔法堂:解读基于Type Erasure的泛型
一.前言 还记得JDK1.4时遍历列表的辛酸吗?我可是记忆犹新啊,那时因项目需求我从C#转身到Java的怀抱,然后因JDK1.4少了泛型这样语法糖(还有自动装箱.拆箱),让我受尽苦头啊,不过也反映自己 ...
- java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题
原 java泛型(二).泛型的内部原理:类型擦除以及类型擦除带来的问题 2012年08月29日 23:44:10 Kilnn 阅读数:56717 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- java反射获取注解id,通过反射获取注解(Annotation)
以下实例,定义一个注解.通过反射获取. 主要功能:为所注解过的参数和方法附加一些信息可以获取. 定义注解. import java.lang.annotation.*; @Retention(Rete ...
- Java笔记整理五(Iterator接口,泛型,常见数据结构(栈,队列,数组,链表,红黑树,集合),jdk新特性,异常,多线程,Lambda表达式)
Java笔记整理五 1.1Iterator接口 Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象 ...
- Java数据结构-基于数组的栈和泛型
泛型可以参数化变量的类型 当你需要用不同类型的基本类型变量来调用构造方法时你需要泛型 public class Test {public static void main(String[] args) ...
- 第三次学JAVA再学不好就吃翔(part82)--泛型
学习笔记,仅供参考 收集的泛型Blog:泛型 泛型 泛型的概述 泛型概述 通常而言我们只会使用容器来存储一种类型的对象.泛型的主要目的之一就是用来指定容器要持有什么类型的,因此与其使用Object,我 ...
最新文章
- java双等号和equals_Java中的 equals和双等号,你懂吗?
- Linux系统服务(systemctl)的使用
- 使用Stackblitz一分钟之内创建一个Angular应用
- 【Python】Matplotlib使用Cursor实现UI定位
- [Java] 蓝桥杯ADV-205 算法提高 拿糖果
- Qt学习之路(60): 创建shared library
- 定制Dynamics CRM标准导出功能:不能导出指定列的值
- Makefile 的使用
- android 导出数据库文件
- Raki的读paper小记:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
- VirtualLab专题实验教程-4.基于超表面的闪耀光栅
- 计算机五笔是什么时候学的吗,电脑五笔输入法怎么学
- 替换修改windows xp字体,为windows 7微软雅黑
- 冉宝的每日一题-8月16日回溯法+ 动态规划压缩
- 如何取消默认浏览器中hao123主页
- 电商项目 Java还是Django_Django电商平台Saleor搭建初体验
- 下载正版的Windows操作系统和office软件
- VUE扫码枪js代码
- python爬虫 多线程 爬取网站排行榜上的所有小说
- Linux通配符的使用详解
热门文章
- Adam那么棒,为什么还对SGD念念不忘 (3)—— 优化算法的选择与使用策略
- LLVM Clang前端编译与调试
- MLIR(Multi-Level Intermediate Representation Compiler)架构 Infrastructure
- Json文件解析(下
- CVPR2020论文解读:3D Object Detection三维目标检测
- wx.getLocation 的使用
- shell 跟踪命令
- cocosstudio csd文件解析为.lua
- 关于 hashcode 和 equals
- short s1 = 1; s1 = s1 + 1;有错而short s1 = 1; s1 += 1正确