Spring 中優(yōu)雅的獲取泛型信息的方法
簡(jiǎn)介
Spring 源碼是個(gè)大寶庫(kù),我們能遇到的大部分工具在源碼里都能找到,所以筆者開(kāi)源的 mica 完全基于 Spring 進(jìn)行基礎(chǔ)增強(qiáng),不重復(fù)造輪子。今天我要分享的是在 Spring 中優(yōu)雅的獲取泛型。
獲取泛型
自己解析
我們之前的處理方式,代碼來(lái)源 vjtools(江南白衣)。
/** * 通過(guò)反射, 獲得Class定義中聲明的父類(lèi)的泛型參數(shù)的類(lèi)型. * * 注意泛型必須定義在父類(lèi)處. 這是唯一可以通過(guò)反射從泛型獲得Class實(shí)例的地方. * * 如無(wú)法找到, 返回Object.class. * * 如public UserDao extends HibernateDao<User,Long> * * @param clazz clazz The class to introspect * @param index the Index of the generic declaration, start from 0. * @return the index generic declaration, or Object.class if cannot be determined */ public static Class getClassGenericType(final Class clazz, final int index) { Type genType = clazz.getGenericSuperclass(); if (!(genType instanceof ParameterizedType)) { logger.warn(clazz.getSimpleName() + "'s superclass not ParameterizedType"); return Object.class; } Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); if ((index >= params.length) || (index < 0)) { logger.warn("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + params.length); return Object.class; } if (!(params[index] instanceof Class)) { logger.warn(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); return Object.class; } return (Class) params[index]; }
ResolvableType 工具
從 Spring 4.0 開(kāi)始 Spring 中添加了 ResolvableType 工具,這個(gè)類(lèi)可以更加方便的用來(lái)回去泛型信息。
首先我們來(lái)看看官方示例:
private HashMap<Integer, List<String>> myMap; public void example() { ResolvableType t = ResolvableType.forField(getClass().getDeclaredField("myMap")); t.getSuperType(); // AbstractMap<Integer, List<String>> t.asMap(); // Map<Integer, List<String>> t.getGeneric(0).resolve(); // Integer t.getGeneric(1).resolve(); // List t.getGeneric(1); // List<String> t.resolveGeneric(1, 0); // String }
詳細(xì)說(shuō)明
構(gòu)造獲取 Field 的泛型信息
ResolvableType.forField(Field)
構(gòu)造獲取 Method 的泛型信息
ResolvableType.forMethodParameter(Method, int)
構(gòu)造獲取方法返回參數(shù)的泛型信息
ResolvableType.forMethodReturnType(Method)
構(gòu)造獲取構(gòu)造參數(shù)的泛型信息
ResolvableType.forConstructorParameter(Constructor, int)
構(gòu)造獲取類(lèi)的泛型信息
ResolvableType.forClass(Class)
構(gòu)造獲取類(lèi)型的泛型信息
ResolvableType.forType(Type)
構(gòu)造獲取實(shí)例的泛型信息
ResolvableType.forInstance(Object)
更多使用 Api 請(qǐng)查看,ResolvableType java doc: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/ResolvableType.html
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解springmvc之json數(shù)據(jù)交互controller方法返回值為簡(jiǎn)單類(lèi)型
- SpringMVC 方法四種類(lèi)型返回值總結(jié)(你用過(guò)幾種)
- SpringBoot異步調(diào)用方法并接收返回值
- Spring MVC Controller返回值及異常的統(tǒng)一處理方法
- 詳解利用SpringMVC攔截器控制Controller返回值
- 詳解SpringCloud Zuul過(guò)濾器返回值攔截
- SpringMVC Controller 返回值的可選類(lèi)型詳解
- Java中Spring獲取bean方法小結(jié)
- 監(jiān)聽(tīng)器獲取Spring配置文件的方法
- springmvc之獲取參數(shù)的方法(必看)
- Spring實(shí)戰(zhàn)之獲取方法返回值操作示例
相關(guān)文章
SpringBoot項(xiàng)目集成Flyway進(jìn)行數(shù)據(jù)庫(kù)版本控制的詳細(xì)教程
這篇文章主要介紹了SpringBoot項(xiàng)目集成Flyway進(jìn)行數(shù)據(jù)庫(kù)版本控制,本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Netty啟動(dòng)流程服務(wù)端channel初始化源碼分析
這篇文章主要為大家介紹了Netty啟動(dòng)流程服務(wù)端channel初始化源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03Spring?Boot如何監(jiān)控SQL運(yùn)行情況?
Druid是Java語(yǔ)言中最好的數(shù)據(jù)庫(kù)連接池,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot如何監(jiān)控SQL運(yùn)行情況的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04教你利用springboot集成swagger并生成接口文檔
有很多小伙伴不會(huì)利用springboot集成swagger并生成接口文檔,今天特地整理了這篇文章,文中有非常詳細(xì)的代碼圖文介紹及代碼示例,對(duì)不會(huì)這個(gè)方法的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05Maven設(shè)置使用自定義的jar包到自己本地倉(cāng)庫(kù)
今天小編就為大家分享一篇關(guān)于Maven設(shè)置使用自定義的jar包到自己本地倉(cāng)庫(kù)的文章,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10Windows下Java調(diào)用可執(zhí)行文件代碼實(shí)例
這篇文章主要介紹了Windows下Java調(diào)用可執(zhí)行文件代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12java多線(xiàn)程編程之使用thread類(lèi)創(chuàng)建線(xiàn)程
在Java中創(chuàng)建線(xiàn)程有兩種方法:使用Thread類(lèi)和使用Runnable接口。在使用Runnable接口時(shí)需要建立一個(gè)Thread實(shí)例2014-01-01Java中System.currentTimeMillis()計(jì)算方式與時(shí)間單位轉(zhuǎn)換講解
本文詳細(xì)講解了Java中System.currentTimeMillis()計(jì)算方式與時(shí)間單位轉(zhuǎn)換,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12