基本信息
文件名称:Java中TypeReference的使用方法.docx
文件大小:16.52 KB
总页数:5 页
更新时间:2025-05-21
总字数:约3.92千字
文档摘要

Java中TypeReference的使用方法

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

voidtestTypeReference(){

ListIntegerlist=newArrayList();

list.add(1);

list.add(9);

list.add(4);

list.add(8);

JSONObjectjsonObj=newJSONObject();

jsonObj.put(a,list);

System.out.println(jsonObj);

ListStringlist2=jsonObj.getObject(a,newTypeReferenceListInteger(){});

System.out.println(list2);

1{a:[1,9,4,8]}

2[1,9,4,8]

{msg:,code:0,data:[{adjEq:,detAIls:[],imr:,isoEq:,mgnRatio:,mmr:,notionalUsd:,ordFroz:,totalEq:0,uTime:1658332171773}]}

//拿code的值

Stringresult1=JSON.toJSONString(result);

System.out.println(result1==+result1);

Resultresult2=JSON.parseObject(result1,newTypeReferenceResult(){});

System.out.println(result2.getCode());

//拿data的值Balance是data中数据的实体类

ResultListBalancelistResult=JSON.parseObject(result1,newTypeReferenceResultListBalance(){});

System.out.println(result2==+listResult.getData());

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

protectedTypeReference(){

TypesuperClass=getClass().getGenericSuperclass();

Typetype=((ParameterizedType)superClass).getActualTypeArguments()[0];

TypecachedType=classTypeCache.get(type);

if(cachedType==null){

classTypeCache.putIfAbsent(type,type);

cachedType=classTypeCache.get(type);

this.type=cachedType;

}

解说:

其中核心的方法是:getActualTypeArguments,它可以得到父类的反省类型

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

Type[]getActualTypeArguments();//返回泛型类型数组

TypegetRawType();//返回原始类型Type

TypegetOwnerType();//返回Type对象,表示此类型是其成员之一的类型。

例如MapString,String对应的ParameterizedType三个方法分别取值如下:

[classjava.lang.String,classjava.lang.String]

interfacejava.util.Map

null

例证:

packageJsonLearn;

importjava.lang.reflect.ParameterizedType;

importjava.lang.reflect.Type;

importjava.util.HashMap;

importjava.util.Map;

publicclassTypeReferencBaseLearn{

publicstaticclassIntMapextendsHashMap