Spring 中優(yōu)雅的獲取泛型信息的方法
簡介
Spring 源碼是個大寶庫,我們能遇到的大部分工具在源碼里都能找到,所以筆者開源的 mica 完全基于 Spring 進行基礎(chǔ)增強,不重復(fù)造輪子。今天我要分享的是在 Spring 中優(yōu)雅的獲取泛型。
獲取泛型
自己解析
我們之前的處理方式,代碼來源 vjtools(江南白衣)。
/**
* 通過反射, 獲得Class定義中聲明的父類的泛型參數(shù)的類型.
*
* 注意泛型必須定義在父類處. 這是唯一可以通過反射從泛型獲得Class實例的地方.
*
* 如無法找到, 返回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
}
詳細說明
構(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)造獲取實例的泛型信息
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實戰(zhàn)之獲取方法返回值操作示例
相關(guān)文章
SpringBoot項目集成Flyway進行數(shù)據(jù)庫版本控制的詳細教程
這篇文章主要介紹了SpringBoot項目集成Flyway進行數(shù)據(jù)庫版本控制,本文分步驟通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
Netty啟動流程服務(wù)端channel初始化源碼分析
這篇文章主要為大家介紹了Netty啟動流程服務(wù)端channel初始化源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03
教你利用springboot集成swagger并生成接口文檔
有很多小伙伴不會利用springboot集成swagger并生成接口文檔,今天特地整理了這篇文章,文中有非常詳細的代碼圖文介紹及代碼示例,對不會這個方法的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05
Windows下Java調(diào)用可執(zhí)行文件代碼實例
這篇文章主要介紹了Windows下Java調(diào)用可執(zhí)行文件代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
java多線程編程之使用thread類創(chuàng)建線程
在Java中創(chuàng)建線程有兩種方法:使用Thread類和使用Runnable接口。在使用Runnable接口時需要建立一個Thread實例2014-01-01
Java中System.currentTimeMillis()計算方式與時間單位轉(zhuǎn)換講解
本文詳細講解了Java中System.currentTimeMillis()計算方式與時間單位轉(zhuǎn)換,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12

