• Java中TypeReference用法说明


    在使用fastJson时,对于泛型的反序列化很多场景下都会使用到TypeReference,例如:

    void testTypeReference() {
    List<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(9);
    list.add(4);
    list.add(8);
    JSONObject jsonObj = new JSONObject();
    jsonObj.put("a", list);
    System.out.println(jsonObj);
    
    List<String> list2 = jsonObj.getObject("a", new TypeReference<List<Integer>>(){});
    
    System.out.println(list2);
    }
    输出
    
    1{"a":[1,9,4,8]}
    2[1, 9, 4, 8]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    {"msg":"","code":"0","data":[{"adjEq":"","details":[],"imr":"","isoEq":"","mgnRatio":"","mmr":"","notionalUsd":"","ordFroz":"","totalEq":"0","uTime":"1658332171773"}]}
    //拿code的值
            String result1 = JSON.toJSONString(result);
            System.out.println("result1=="+result1);
    
            Result result2 = JSON.parseObject(result1, new TypeReference<Result>() {});
            System.out.println(result2.getCode());
    //拿data的值   Balance是data中数据的实体类
    		Result<List<Balance>> listResult = JSON.parseObject(result1, new TypeReference<Result<List<Balance>>>() {});
            System.out.println("result2=="+listResult.getData());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    使用TypeReference可以明确的指定反序列化的类型,具体实现逻辑参考TypeReference的构造函数

    protected TypeReference(){
    Type superClass = getClass().getGenericSuperclass();

    Type type = ((ParameterizedType) superClass).getActualTypeArguments()[0];

    Type cachedType = classTypeCache.get(type);
    if (cachedType == null) {
    classTypeCache.putIfAbsent(type, type);
    cachedType = classTypeCache.get(type);
    }

    this.type = cachedType;
    }
    解说
    其中核心的方法是:getActualTypeArguments,它可以得到父类的反省类型

    ParameterizedType是一个记录类型泛型的接口, 继承自Type,一共三方法:

    Type[] getActualTypeArguments(); //返回泛型类型数组
    Type getRawType(); //返回原始类型Type
    Type getOwnerType(); //返回 Type 对象,表示此类型是其成员之一的类型。
    例如 Map 对应的ParameterizedType三个方法分别取值如下:

    [class java.lang.String, class java.lang.String]
    interface java.util.Map
    null
    例证
    package JsonLearn;

    import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;
    import java.util.HashMap;
    import java.util.Map;

    public class TypeReferencBaseLearn {
    public static class IntMap extends HashMap {}

    void test1() {
    IntMap intMap = new IntMap();
    System.out.println(“getSuperclass:” + intMap.getClass().getSuperclass());
    System.out.println(“getGenericSuperclass:” + intMap.getClass().getGenericSuperclass());
    Type type = intMap.getClass().getGenericSuperclass();
    if (type instanceof ParameterizedType) {
    ParameterizedType p = (ParameterizedType)type;
    for (Type t : p.getActualTypeArguments()) {
    System.out.println(t);
    }
    }
    }

    void test2() {
    Map intMap = new HashMap<>();
    System.out.println(“\ngetSuperclass:” + intMap.getClass().getSuperclass());
    System.out.println(“getGenericSuperclass:” + intMap.getClass().getGenericSuperclass());
    Type type = intMap.getClass().getGenericSuperclass();
    if (type instanceof ParameterizedType) {
    ParameterizedType p = (ParameterizedType)type;
    for (Type t : p.getActualTypeArguments()) {
    System.out.println(t);
    }
    }
    }

    void test3() {
    Map intMap = new HashMap(){};
    System.out.println(“\ngetSuperclass:” + intMap.getClass().getSuperclass());
    System.out.println(“getGenericSuperclass:” + intMap.getClass().getGenericSuperclass());
    Type type = intMap.getClass().getGenericSuperclass();
    if (type instanceof ParameterizedType) {
    ParameterizedType p = (ParameterizedType)type;
    for (Type t : p.getActualTypeArguments()) {
    System.out.println(t);
    }
    }
    }

    public static void main(String[] args) {
    TypeReferencBaseLearn obj = new TypeReferencBaseLearn();
    obj.test1();
    obj.test2();
    obj.test3();
    }
    }
    输出

    getSuperclass:class java.util.HashMap
    getGenericSuperclass:java.util.HashMap
    class java.lang.String
    class java.lang.Integer

    getSuperclass:class java.util.AbstractMap
    getGenericSuperclass:java.util.AbstractMap
    K
    V

    getSuperclass:class java.util.HashMap
    getGenericSuperclass:java.util.HashMap
    class java.lang.String
    class java.lang.Integer

  • 相关阅读:
    给yarn/npm包管理设置代理加速nodejs依赖下载的方法
    使用容器快速在阿里云 ECS 多节点上搭建 Citus 12.1 集群
    Armv9 Cortex-A720的L2 memory system 和 L2 Cache
    node-rsa公钥私钥加密解密
    使用阿里云Logstash,从自建es6.2.4迁移数据至云ES7.10测试
    uni-app 安卓手机判断是否开启相机相册权限
    iptables总结存档
    Redis最佳实践(上)
    linux串口设备配置方法(固定ID)
    【Matplotlib绘制图像大全】(二十二):Matplotlib绘制气泡图
  • 原文地址:https://blog.csdn.net/qq_42981242/article/details/125903197