您好,欢迎访问一九零五行业门户网

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]
{"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());
使用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(); //返回原始类型typetype getownertype(); //返回 type 对象,表示此类型是其成员之一的类型。
例如 map<string,string> 对应的parameterizedtype三个方法分别取值如下:
[class java.lang.string, class java.lang.string]interface java.util.mapnull
例证:
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.hashmap44cb3c2644e606fc27bf458e067c32ee
class java.lang.string
class java.lang.integer
getsuperclass:class java.util.abstractmap
getgenericsuperclass:java.util.abstractmapb56561a2c0bc639cf0044c0859afb88f
k
v
getsuperclass:class java.util.hashmap
getgenericsuperclass:java.util.hashmap44cb3c2644e606fc27bf458e067c32ee
class java.lang.string
class java.lang.integer
以上就是java中typereference的使用方法的详细内容。
其它类似信息

推荐信息