如何获取泛型的Type类型

—— 通过guava的TypeToken获取泛型Type类型
标签: TypeToken 泛型
2017-11-28 阅读(285)

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

不使用TypeToken效果图.jpg


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

使用TypeToken效果图.jpg


最后

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


zip icon
获取泛型的类型例子.zip 5060f40b6ca00d5c42c03c26533a581d

已下载:4 次     

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

分类:
点击(335) 阅读(285) 举报