开发中很多时候都遇到或使用到泛型。例如在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类型相关推荐

  1. Java通过Class的对象来获取泛型的class示例

    转载自  Java通过Class的对象来获取泛型的class示例 在使用spring的JdbcTemplate实现DAO的时候,经常会用到一个类ParameterizedBeanPropertyRow ...

  2. java 获取泛型t的class_阿里巴巴都鼎力推荐的java基础之集合其他内容和泛型3

    第三节 泛型 3.1为什么需要泛型 没有采用泛型之前 1.不安全:添加元素是无检查 宽进 2.繁琐:获取元素时需要强制类型转换 严出 采用泛型之后 1.安全 严进 2.简单 宽出 3.2什么是泛型ge ...

  3. 利用反射,泛型,静态方法快速获取表单值到Model。

    初级的,很简单,牛人可以不看了.不过还算实用. 在项目中经常需要处理表单,给model赋值,很烦人的一些重复代码.如下边的代码: Code             News news = new Ne ...

  4. Java魔法堂:解读基于Type Erasure的泛型

    一.前言 还记得JDK1.4时遍历列表的辛酸吗?我可是记忆犹新啊,那时因项目需求我从C#转身到Java的怀抱,然后因JDK1.4少了泛型这样语法糖(还有自动装箱.拆箱),让我受尽苦头啊,不过也反映自己 ...

  5. java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题

    原 java泛型(二).泛型的内部原理:类型擦除以及类型擦除带来的问题 2012年08月29日 23:44:10 Kilnn 阅读数:56717 版权声明:本文为博主原创文章,未经博主允许不得转载. ...

  6. java反射获取注解id,通过反射获取注解(Annotation)

    以下实例,定义一个注解.通过反射获取. 主要功能:为所注解过的参数和方法附加一些信息可以获取. 定义注解. import java.lang.annotation.*; @Retention(Rete ...

  7. Java笔记整理五(Iterator接口,泛型,常见数据结构(栈,队列,数组,链表,红黑树,集合),jdk新特性,异常,多线程,Lambda表达式)

    Java笔记整理五 1.1Iterator接口 Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象 ...

  8. Java数据结构-基于数组的栈和泛型

    泛型可以参数化变量的类型 当你需要用不同类型的基本类型变量来调用构造方法时你需要泛型 public class Test {public static void main(String[] args) ...

  9. 第三次学JAVA再学不好就吃翔(part82)--泛型

    学习笔记,仅供参考 收集的泛型Blog:泛型 泛型 泛型的概述 泛型概述 通常而言我们只会使用容器来存储一种类型的对象.泛型的主要目的之一就是用来指定容器要持有什么类型的,因此与其使用Object,我 ...

最新文章

  1. java双等号和equals_Java中的 equals和双等号,你懂吗?
  2. Linux系统服务(systemctl)的使用
  3. 使用Stackblitz一分钟之内创建一个Angular应用
  4. 【Python】Matplotlib使用Cursor实现UI定位
  5. [Java] 蓝桥杯ADV-205 算法提高 拿糖果
  6. Qt学习之路(60): 创建shared library
  7. 定制Dynamics CRM标准导出功能:不能导出指定列的值
  8. Makefile 的使用
  9. android 导出数据库文件
  10. Raki的读paper小记:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  11. VirtualLab专题实验教程-4.基于超表面的闪耀光栅
  12. 计算机五笔是什么时候学的吗,电脑五笔输入法怎么学
  13. 替换修改windows xp字体,为windows 7微软雅黑
  14. 冉宝的每日一题-8月16日回溯法+ 动态规划压缩
  15. 如何取消默认浏览器中hao123主页
  16. 电商项目 Java还是Django_Django电商平台Saleor搭建初体验
  17. 下载正版的Windows操作系统和office软件
  18. VUE扫码枪js代码
  19. python爬虫 多线程 爬取网站排行榜上的所有小说
  20. Linux通配符的使用详解

热门文章

  1. Adam那么棒,为什么还对SGD念念不忘 (3)—— 优化算法的选择与使用策略
  2. LLVM Clang前端编译与调试
  3. MLIR(Multi-Level Intermediate Representation Compiler)架构 Infrastructure
  4. Json文件解析(下
  5. CVPR2020论文解读:3D Object Detection三维目标检测
  6. wx.getLocation 的使用
  7. shell 跟踪命令
  8. cocosstudio csd文件解析为.lua
  9. 关于 hashcode 和 equals
  10. short s1 = 1; s1 = s1 + 1;有错而short s1 = 1; s1 += 1正确