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了。

85f3b78f46ae05ffc1979c4e5ecbeb5d.png

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对象属性也是对的。

3220b0582ec4393c8fcc21e2df979b53.png

最后

给出完整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

08141478c915f303bf8c8f7212e70ca4.png

获取泛型的类型例子.zip

5060f40b6ca00d5c42c03c26533a581d

已下载:20 次

原创文章,转载请注明出处:https://www.weizhixi.com/article/7.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值