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