第
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