Java中TypeReference用法说明

Java中TypeReference用法说明用途在使用fastJson时,对于泛型的反序列化很多场景下都会使用到TypeReference,例如:voidtestTypeReference(){List<Integer>list=newArrayList<>();list.add(1);list.add(9);list.ad…

大家好,又见面了,我是你们的朋友全栈君。

用途

在使用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]

使用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<String,String> 对应的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<String, Integer> {}

    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<String, Integer> 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<String, Integer> intMap = new HashMap<String, Integer>(){};
        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<java.lang.String, java.lang.Integer>
class java.lang.String
class java.lang.Integer
 
getSuperclass:class java.util.AbstractMap
getGenericSuperclass:java.util.AbstractMap<K, V>
K
V
 
getSuperclass:class java.util.HashMap
getGenericSuperclass:java.util.HashMap<java.lang.String, java.lang.Integer>
class java.lang.String
class java.lang.Integer 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147934.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • EFK(Elasticsearch+Filebeat+Kibana)日志收集系统

    EFK(Elasticsearch+Filebeat+Kibana)日志收集系统

    2021年6月2日
    103
  • Maximum execution time of 30 seconds exceeded解决办法

    Maximum execution time of 30 seconds exceeded解决办法

    2021年10月21日
    43
  • 预测大盘最准确的指标_预测大盘走势最牛的指标(经典)

    预测大盘最准确的指标_预测大盘走势最牛的指标(经典)★金融工程研究报告——国海证券2010年量化择时绩效全年盘点报告★国海证券研究所金融工程团队构建了数量化择时系统,以不定期发布《国海量化择时导报》的形式,表达国海金工团队对股市大势的研判及观点。回顾2010年波诡云谲的中国股市,该择时系统屡屡精准地对股市的阶段性趋势作出预判及风险提示,获得多方认可。量化择时系统2010年全年表现国海金工量化择时系统2010年全年表现优异,对股市大的拐点把握次次命…

    2022年6月29日
    62
  • 同相放大器有平衡电阻吗?

    同相放大器有平衡电阻吗?系列文章目录 1 元件基础 2 电路设计 3 PCB 设计 4 元件焊接这个所谓的平衡电阻 需要具体情况具体分析 可能有可能无 不要生搬硬套 根据剃刀法则 如无必要 勿增实体首先是理想运放 理想运放放大的是同向和反向输入端的电压差 最简单的同向放大器如下图 忽略虚线框内的 Rg 理想运放的输入阻抗是无穷大 所以两输入端不会有电流流入流出 这个时候如果同向输入端加入一个平衡电阻 Rg 不会有电流流过 Rg 对整个电路不会有任何影响 所以这个平衡电阻没有意义 是不必要的 再来看看最简单的反

    2025年10月13日
    3
  • fscanf()函数具体解释

    fscanf()函数具体解释

    2021年12月15日
    84
  • Android 调用微信小程序支付badparam_微信定时发消息

    Android 调用微信小程序支付badparam_微信定时发消息最近一项目需要添加微信的分享:朋友、朋友圈。原本以为挺简单的一事,无非就是去官网下个Demo,集成到自己项目中,可以分分钟搞定,结果这帮写文档的坑爹玩意,愣是浪费了我N多时间,好了吐槽完毕,接下来分享下此次调用微信中遇到的问题和解决方法:首先第一个问题:死活调不出微信客户端原因:是没有按照所谓的官方说明来操作,解决方法:1)对要加微信的项目进行打包签名,此时就有了自己的

    2022年9月1日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号