原文地址: https://www.cn blogs.com/CX ygg/p/9473506.html
使用fastJson时,许多通用的反序列化场景都使用类型参考
使用TypeReference,可以显式指定反序列化的类型,以具体实现逻辑引用TypeReference的构造函数
首先,TypeReference是描述复杂通用性的工具类。
虽然TypeReference位于许多类库中,但使用fastjson示例通常就是这个意思。
示例:
response response=JSON object.parse object (result,new TypeReferenceResponse () );
new TypeReferenceResponse表示名为Response的类。 同样,可以实现更多层次的嵌套通用。
如果TypeReference的通用参数是通用变量。 可以使用参数修饰通用变量。
看看如何构建类型参考的源代码:
保护类型参考
Type superClass=getClass ().getGenericSuperclass );
type type=(参数化类型) superClass ).getActualTypeArguments ) [0]; typecachedtype=classtype cache.get (type; if(cachedtype==null ) classtype cache.putifabsent (type,type ); chedtype=classtype cache.get (type; } this.type=cachedType; }
//*
* @since 1.2.9
* @param actualTypeArguments
*/
protectedtypereference (type . actualtypearguments )。
Class? thisClass=this.getClass (;
type super class=this class.getgenericsuperclass (;
parameterizedtypeargtype=(参数化类型) ) parameterized type (super class ).getActualTypeArguments ) (0); Type rawType=argType.getRawType (; type [ ] argtypes=argtype.getactualtypearguments (; int actualIndex=0; for(intI=0; i argTypes.length; I ) if (argtypes [ I ] instanceoftypevariableactualindexactualtypearguments.length ) argtypes [ I ]=actualtypeargumenth/fixforopenjdkandandroidenvif (argtypes [ I ] instanceofgenericarraytype (argtypes [ I ]=type utils.checkprimitiver ) type typecachedtype=classtype cache.get (key; if(cachedtype==null ) classtypecache.putifabsent(key,key ); cached type=classtype cache.get (key; }类型=cached type; }
在以上的无参结构方法中取得参数通用ParameterizedType,在后面的有差结构方法中将参数通用中作为通用变量的内容置换为参数。
示例:响应响应=JSON object.parse object (result,newtypereferenceresponse (respdatacls ) );
等效: response response=jjsonobject.parse object (result,new TypeReferenceResponse ) } ) )
使用通用变量时,需要有参数的写法。
备注:上面的respdatacls=taskcoderespdata.class
注意:如果t是通用变量,则如果未传递后续限定参数t,则将其识别为t的上边界。 t被识别为RespData,t被识别为Object (根据t的定义)。 )
转载于:https://www.cn blogs.com/leesindong/p/10835628.html