Spring 中優(yōu)雅的獲取泛型信息的方法
簡介
Spring 源碼是個大寶庫,我們能遇到的大部分工具在源碼里都能找到,所以筆者開源的 mica 完全基于 Spring 進(jìn)行基礎(chǔ)增強(qiáng),不重復(fù)造輪子。今天我要分享的是在 Spring 中優(yōu)雅的獲取泛型。
獲取泛型
自己解析
我們之前的處理方式,代碼來源 vjtools(江南白衣)。
/**
* 通過反射, 獲得Class定義中聲明的父類的泛型參數(shù)的類型.
*
* 注意泛型必須定義在父類處. 這是唯一可以通過反射從泛型獲得Class實(shí)例的地方.
*
* 如無法找到, 返回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 開始 Spring 中添加了 ResolvableType 工具,這個類可以更加方便的用來回去泛型信息。
首先我們來看看官方示例:
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ì)說明
構(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)造獲取類的泛型信息
ResolvableType.forClass(Class)
構(gòu)造獲取類型的泛型信息
ResolvableType.forType(Type)
構(gòu)造獲取實(shí)例的泛型信息
ResolvableType.forInstance(Object)
更多使用 Api 請查看,ResolvableType java doc: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/ResolvableType.html
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解springmvc之json數(shù)據(jù)交互controller方法返回值為簡單類型
- SpringMVC 方法四種類型返回值總結(jié)(你用過幾種)
- SpringBoot異步調(diào)用方法并接收返回值
- Spring MVC Controller返回值及異常的統(tǒng)一處理方法
- 詳解利用SpringMVC攔截器控制Controller返回值
- 詳解SpringCloud Zuul過濾器返回值攔截
- SpringMVC Controller 返回值的可選類型詳解
- Java中Spring獲取bean方法小結(jié)
- 監(jiān)聽器獲取Spring配置文件的方法
- springmvc之獲取參數(shù)的方法(必看)
- Spring實(shí)戰(zhàn)之獲取方法返回值操作示例
相關(guān)文章
springboot 設(shè)置server.port不生效的原因及解決
這篇文章主要介紹了springboot 設(shè)置server.port不生效的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Mybatis-plus 批量插入太慢的問題解決(提升插入性能)
公司使用的Mybatis-Plus操作SQL,用過Mybatis-Plus的小伙伴一定知道他有很多API提供給我們使用,但是批量插入大數(shù)據(jù)太慢應(yīng)該怎么解決,本文就詳細(xì)的介紹一下,感興趣的可以了解一下2021-11-11
Java中線程狀態(tài)+線程安全問題+synchronized的用法詳解
這篇文章主要介紹了Java中線程狀態(tài)+線程安全問題+synchronized的用法詳解,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04
java并發(fā)編程中的SynchronousQueue實(shí)現(xiàn)原理解析
這篇文章主要介紹了java并發(fā)編程中的SynchronousQueue實(shí)現(xiàn)原理解析,SynchronousQueue是一個比較特別的隊(duì)列,此隊(duì)列源碼中充斥著大量的CAS語句,理解起來是有些難度的,為了方便日后回顧,本篇文章會以簡潔的圖形化方式展示該隊(duì)列底層的實(shí)現(xiàn)原理,需要的朋友可以參考下2023-12-12
java實(shí)現(xiàn)點(diǎn)擊按鈕事件彈出子窗口
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)點(diǎn)擊按鈕事件彈出子窗口,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-07-07
SpringCloud超詳細(xì)講解Feign聲明式服務(wù)調(diào)用
Feign可以把Rest的請求進(jìn)行隱藏,偽裝成類似Spring?MVC的Controller一樣。不用再自己拼接url,拼接參數(shù)等等操作,一切都交給Feign去做2022-06-06

