摘要:今天我要分享的是在中優(yōu)雅的獲取泛型。通過(guò)反射獲得定義中聲明的父類(lèi)的泛型參數(shù)的類(lèi)型注意泛型必須定義在父類(lèi)處這是唯一可以通過(guò)反射從泛型獲得實(shí)例的地方如無(wú)法找到返回如工具從開(kāi)始中添加了工具,這個(gè)類(lèi)可以更加方便的用來(lái)回去泛型信息。
簡(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 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 開(kāi)始 Spring 中添加了 ResolvableType 工具,這個(gè)類(lèi)可以更加方便的用來(lái)回去泛型信息。
首先我們來(lái)看看官方示例:
private HashMap詳細(xì)說(shuō)明 構(gòu)造獲取 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)構(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...
開(kāi)源推薦Spring boot 微服務(wù)高效開(kāi)發(fā)?mica?工具集:https://gitee.com/596392912/mica
Avue?一款基于vue可配置化的神奇框架:https://gitee.com/smallweigit/avue
pig?宇宙最強(qiáng)微服務(wù)(架構(gòu)師必備):https://gitee.com/log4j/pig
SpringBlade?完整的線(xiàn)上解決方案(企業(yè)開(kāi)發(fā)必備):https://gitee.com/smallc/SpringBlade
IJPay 支付SDK讓支付觸手可及:https://gitee.com/javen205/IJPay
加入【如夢(mèng)技術(shù)】Spring QQ群:479710041,了解更多。
關(guān)注我們掃描上面二維碼,更多精彩內(nèi)容每天推薦!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73957.html
摘要:第章元編程與注解反射反射是在運(yùn)行時(shí)獲取類(lèi)的函數(shù)方法屬性父類(lèi)接口注解元數(shù)據(jù)泛型信息等類(lèi)的內(nèi)部信息的機(jī)制。本章介紹中的注解與反射編程的相關(guān)內(nèi)容。元編程本質(zhì)上是一種對(duì)源代碼本身進(jìn)行高層次抽象的編碼技術(shù)。反射是促進(jìn)元編程的一種很有價(jià)值的語(yǔ)言特性。 第12章 元編程與注解、反射 反射(Reflection)是在運(yùn)行時(shí)獲取類(lèi)的函數(shù)(方法)、屬性、父類(lèi)、接口、注解元數(shù)據(jù)、泛型信息等類(lèi)的內(nèi)部信息的機(jī)...
摘要:以下內(nèi)容基于如果你使用的也是相同的技術(shù)??梢岳^續(xù)往下閱讀,如果不是可以當(dāng)作參考。編寫(xiě)的四種方式裸寫(xiě)最簡(jiǎn)單最粗暴也是使用最多的一種方式,在寫(xiě)的多了之后可以用生成工具生成。 導(dǎo)讀 在目前接觸過(guò)的項(xiàng)目中大多數(shù)的項(xiàng)目都會(huì)涉及到: crud相關(guān)的操作, 哪如何優(yōu)雅的編寫(xiě)crud操作呢?帶著這個(gè)問(wèn)題,我們發(fā)現(xiàn)項(xiàng)目中大量的操作多是 創(chuàng)建實(shí)體 、刪除實(shí)例、 修改實(shí)體、 查詢(xún)單個(gè)實(shí)體、 分頁(yè)查詢(xún)多個(gè)實(shí)體...
摘要:實(shí)踐很簡(jiǎn)單的一個(gè)類(lèi),點(diǎn)開(kāi)它的源代碼,其中所有的方法都是與相關(guān)聯(lián)的。從而很好地避免了空指針異常。方法,如果存在,返回包含的值,否則拋出異常。隨便點(diǎn)開(kāi)一個(gè)方法,都會(huì)在第一行為不該為的參數(shù)進(jìn)行判斷。 問(wèn)題描述 在大熱的Spring Boot 2.0中,在將原來(lái)的泛型改為了Optional,旨在讓我們的代碼更簡(jiǎn)潔。 showImg(https://segmentfault.com/img/bV...
摘要:引用泛型除了方法因不能使用外部實(shí)例參數(shù)外,其他繼承實(shí)現(xiàn)成員變量,成員方法,方法返回值等都可使用。因此,生成的字節(jié)碼僅包含普通的類(lèi),接口和方法。 為什么要使用泛型程序設(shè)計(jì)? 一般的類(lèi)和方法,只能使用具體的類(lèi)型:要么是基本類(lèi)型,要么是自定義類(lèi)的對(duì)應(yīng)類(lèi)型;如果要編寫(xiě)可以應(yīng)用于多種類(lèi)型的代碼,這種刻板的限制對(duì)代碼的束縛就會(huì)很大。----摘自原書(shū)Ordinary classes and meth...
摘要:反射的使用通過(guò)反射獲取構(gòu)造方法并使用首先我們聲明一個(gè)類(lèi)方便我們進(jìn)行介紹默認(rèn)的構(gòu)造方法默認(rèn)的構(gòu)造方法無(wú)參構(gòu)造方法調(diào)用了公有無(wú)參構(gòu)造方法執(zhí)行了。。。 1.概述 1.1 什么是反射 java反射機(jī)制是指在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法,對(duì)于任意一個(gè)對(duì)象,都能調(diào)用它的任意一個(gè)方法和屬性,這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱(chēng)為java語(yǔ)言的反射機(jī)制。 1...
閱讀 1535·2021-11-23 09:51
閱讀 3649·2021-09-26 09:46
閱讀 2139·2021-09-22 10:02
閱讀 1864·2019-08-30 15:56
閱讀 3335·2019-08-30 12:51
閱讀 2240·2019-08-30 11:12
閱讀 2070·2019-08-29 13:23
閱讀 2332·2019-08-29 13:16