Java中TypeReference用法詳情說明
在使用fastJson時(shí),對(duì)于泛型的反序列化很多場(chǎng)景下都會(huì)使用到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中數(shù)據(jù)的實(shí)體類 Result<List<Balance>> listResult = JSON.parseObject(result1, new TypeReference<Result<List<Balance>>>() {}); System.out.println("result2=="+listResult.getData());
使用TypeReference可以明確的指定反序列化的類型,具體實(shí)現(xiàn)邏輯參考TypeReference的構(gòu)造函數(shù)
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是一個(gè)記錄類型泛型的接口, 繼承自Type,一共三方法:
Type[] getActualTypeArguments(); //返回泛型類型數(shù)組 Type getRawType(); //返回原始類型Type Type getOwnerType(); //返回 Type 對(duì)象,表示此類型是其成員之一的類型。
例如 Map<String,String> 對(duì)應(yīng)的ParameterizedType三個(gè)方法分別取值如下:
[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.IntegergetSuperclass:class java.util.AbstractMap
getGenericSuperclass:java.util.AbstractMap<K, V>
K
VgetSuperclass:class java.util.HashMap
getGenericSuperclass:java.util.HashMap<java.lang.String, java.lang.Integer>
class java.lang.String
class java.lang.Integer
到此這篇關(guān)于Java中TypeReference用法詳情說明的文章就介紹到這了,更多相關(guān)Java TypeReference用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot 利用MultipartFile上傳本地圖片生成圖片鏈接的實(shí)現(xiàn)方法
這篇文章主要介紹了SpringBoot 利用MultipartFile上傳本地圖片生成圖片鏈接的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Java超詳細(xì)講解設(shè)計(jì)模式之一的單例模式
單例模式(Singleton Pattern)是 Java 中最簡(jiǎn)單的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式2022-03-03@TransactionalEventListener的使用和實(shí)現(xiàn)原理分析
這篇文章主要介紹了@TransactionalEventListener的使用和實(shí)現(xiàn)原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Spring Boot MyBatis 連接數(shù)據(jù)庫配置示例
本篇文章主要介紹了Spring Boot MyBatis 連接數(shù)據(jù)庫示例的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02SpringBoot+JUnit5+MockMvc+Mockito單元測(cè)試的實(shí)現(xiàn)
今天聊聊如何在 SpringBoot 中集成 Junit5、MockMvc、Mocktio。Junit5 是在 Java 棧中應(yīng)用最廣的測(cè)試框架,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09java 基礎(chǔ)之JavaBean屬性命名規(guī)范問題
這篇文章主要介紹了java 基礎(chǔ)之JavaBean屬性命名規(guī)范問題的相關(guān)資料,需要的朋友可以參考下2017-05-05Spring @Configuration和@Component的區(qū)別
今天小編就為大家分享一篇關(guān)于Spring @Configuration和@Component的區(qū)別,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12