java 获取泛型的type,如何获取泛型的Type类型
開發(fā)中很多時(shí)候都遇到或使用到泛型。例如在json轉(zhuǎn)換成bean對(duì)象或其他對(duì)象,而對(duì)象中存在泛型,這時(shí)候需要用到TypeToken。
Type:是java里的 java.lang.reflect.Type;
TypeToken:是guava提供的抽象類能夠獲取泛型類型
開門見山
通過TypeToken獲取泛型Type類型TypeToken?typeToken?=?new?TypeToken>>(){};
Type?type?=?typeToken.getType();
舉個(gè)栗子
例如通過JSON字符串轉(zhuǎn)換成對(duì)象 且 還要保持原有類型(包括泛型類型)
1、模擬數(shù)據(jù)列表//模擬數(shù)據(jù)列表
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"}]
看下圖,使用調(diào)試看到,執(zhí)行完result1的時(shí)候看到:result1對(duì)象為ArrayList,User對(duì)象不能正常轉(zhuǎn)化類型為JSONObject,User對(duì)象屬性變了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
再來下圖,使用調(diào)試看到,執(zhí)行完result2的時(shí)候看到:result2象為ArrayList,User對(duì)象已經(jīng)正常轉(zhuǎn)化類型為User,User對(duì)象屬性也是對(duì)的。
最后
給出完整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();
//模擬數(shù)據(jù)列表
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 次
原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處:https://www.weizhixi.com/article/7.html
總結(jié)
以上是生活随笔為你收集整理的java 获取泛型的type,如何获取泛型的Type类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小女子求问大家怎么搞定摩羯座男生~~~求
- 下一篇: 海贼王动画是谁画的啊?