如何获取泛型的Type类型
阅读(1287)
2017-11-28
开发中很多时候都遇到或使用到泛型。例如在json转换成bean对象或其他对象,而对象中存在泛型,这时候需要用到TypeToken。
Type:是java里的 java.lang.reflect.Type;
TypeToken:是guava提供的抽象类能够获取泛型类型
开门见山
通过TypeToken获取泛型Type类型
TypeToken typeToken = new TypeToken<ArrayList<User<String>>>(){}; Type type = typeToken.getType();
举个栗子
例如通过JSON字符串转换成对象 且 还要保持原有类型(包括泛型类型)
1、模拟数据列表
//模拟数据列表 List<User<String>> list = new ArrayList<User<String>>(); list.add(new User<String>(1,"hello")); list.add(new User<String>(2,"world")); String json = JSONArray.toJSONString(list); System.out.println(json); //输出:[{"id":1,"name":"hello"},{"id":2,"name":"world"}]
2、不使用TypeToken
//我们来看看不使用TypeToken的情况 List<User<String>> 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<User<String>> 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.java
package 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<ArrayList<User<String>>>(){}; Type type = typeToken.getType(); //模拟数据列表 List<User<String>> list = new ArrayList<User<String>>(); list.add(new User<String>(1,"hello")); list.add(new User<String>(2,"world")); String json = JSONArray.toJSONString(list); System.out.println(json); //输出:[{"id":1,"name":"hello"},{"id":2,"name":"world"}] //我们来看看不使用TypeToken的情况 List<User<String>> result1 = JSONArray.parseObject(json, list.getClass()); System.out.println(result1); //输出:[{"id":1,"name":"hello"}, {"id":2,"name":"world"}] //再来看看使用TypeToken的情况 List<User<String>> 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.java
package com.weizhixi.test; /** * Created by cxq on 2017-11-27. */ public class User<T>{ 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
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>16.0.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.41</version> </dependency>
已下载:159 次
原创文章,转载请注明出处:https://www.weizhixi.com/article/7.html