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