摘要:今天我要分享的是在中優雅的獲取泛型。通過反射獲得定義中聲明的父類的泛型參數的類型注意泛型必須定義在父類處這是唯一可以通過反射從泛型獲得實例的地方如無法找到返回如工具從開始中添加了工具,這個類可以更加方便的用來回去泛型信息。
簡介
Spring 源碼是個大寶庫,我們能遇到的大部分工具在源碼里都能找到,所以筆者開源的 mica 完全基于 Spring 進行基礎增強,不重復造輪子。今天我要分享的是在 Spring 中優雅的獲取泛型。
獲取泛型 自己解析我們之前的處理方式,代碼來源 vjtools(江南白衣)。
/** * 通過反射, 獲得Class定義中聲明的父類的泛型參數的類型. * * 注意泛型必須定義在父類處. 這是唯一可以通過反射從泛型獲得Class實例的地方. * * 如無法找到, 返回Object.class. * * 如public UserDao extends HibernateDaoResolvableType 工具* * @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]; }
從 Spring 4.0 開始 Spring 中添加了 ResolvableType 工具,這個類可以更加方便的用來回去泛型信息。
首先我們來看看官方示例:
private HashMap詳細說明 構造獲取 Field 的泛型信息> myMap; public void example() { ResolvableType t = ResolvableType.forField(getClass().getDeclaredField("myMap")); t.getSuperType(); // AbstractMap > t.asMap(); // Map > t.getGeneric(0).resolve(); // Integer t.getGeneric(1).resolve(); // List t.getGeneric(1); // List t.resolveGeneric(1, 0); // String }
ResolvableType.forField(Field)構造獲取 Method 的泛型信息
ResolvableType.forMethodParameter(Method, int)構造獲取方法返回參數的泛型信息
ResolvableType.forMethodReturnType(Method)構造獲取構造參數的泛型信息
ResolvableType.forConstructorParameter(Constructor, int)構造獲取類的泛型信息
ResolvableType.forClass(Class)構造獲取類型的泛型信息
ResolvableType.forType(Type)構造獲取實例的泛型信息
ResolvableType.forInstance(Object)
更多使用 Api 請查看,ResolvableType java doc: https://docs.spring.io/spring...
開源推薦Spring boot 微服務高效開發?mica?工具集:https://gitee.com/596392912/mica
Avue?一款基于vue可配置化的神奇框架:https://gitee.com/smallweigit/avue
pig?宇宙最強微服務(架構師必備):https://gitee.com/log4j/pig
SpringBlade?完整的線上解決方案(企業開發必備):https://gitee.com/smallc/SpringBlade
IJPay 支付SDK讓支付觸手可及:https://gitee.com/javen205/IJPay
加入【如夢技術】Spring QQ群:479710041,了解更多。
關注我們掃描上面二維碼,更多精彩內容每天推薦!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73957.html
摘要:第章元編程與注解反射反射是在運行時獲取類的函數方法屬性父類接口注解元數據泛型信息等類的內部信息的機制。本章介紹中的注解與反射編程的相關內容。元編程本質上是一種對源代碼本身進行高層次抽象的編碼技術。反射是促進元編程的一種很有價值的語言特性。 第12章 元編程與注解、反射 反射(Reflection)是在運行時獲取類的函數(方法)、屬性、父類、接口、注解元數據、泛型信息等類的內部信息的機...
摘要:以下內容基于如果你使用的也是相同的技術棧可以繼續往下閱讀,如果不是可以當作參考。編寫的四種方式裸寫最簡單最粗暴也是使用最多的一種方式,在寫的多了之后可以用生成工具生成。 導讀 在目前接觸過的項目中大多數的項目都會涉及到: crud相關的操作, 哪如何優雅的編寫crud操作呢?帶著這個問題,我們發現項目中大量的操作多是 創建實體 、刪除實例、 修改實體、 查詢單個實體、 分頁查詢多個實體...
摘要:實踐很簡單的一個類,點開它的源代碼,其中所有的方法都是與相關聯的。從而很好地避免了空指針異常。方法,如果存在,返回包含的值,否則拋出異常。隨便點開一個方法,都會在第一行為不該為的參數進行判斷。 問題描述 在大熱的Spring Boot 2.0中,在將原來的泛型改為了Optional,旨在讓我們的代碼更簡潔。 showImg(https://segmentfault.com/img/bV...
摘要:引用泛型除了方法因不能使用外部實例參數外,其他繼承實現成員變量,成員方法,方法返回值等都可使用。因此,生成的字節碼僅包含普通的類,接口和方法。 為什么要使用泛型程序設計? 一般的類和方法,只能使用具體的類型:要么是基本類型,要么是自定義類的對應類型;如果要編寫可以應用于多種類型的代碼,這種刻板的限制對代碼的束縛就會很大。----摘自原書Ordinary classes and meth...
閱讀 1528·2021-11-23 09:51
閱讀 3642·2021-09-26 09:46
閱讀 2130·2021-09-22 10:02
閱讀 1837·2019-08-30 15:56
閱讀 3324·2019-08-30 12:51
閱讀 2232·2019-08-30 11:12
閱讀 2067·2019-08-29 13:23
閱讀 2328·2019-08-29 13:16