最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java獲取泛型實(shí)際類型的方法詳解

 更新時(shí)間:2023年11月06日 09:54:09   作者:楊小胖要減肥  
這篇文章主要介紹了Java獲取泛型實(shí)際類型的方法詳解,泛型,即“參數(shù)化類型”,一提到參數(shù),最熟悉的就是定義方法時(shí)有形參列表,普通方法的形參列表中,每個(gè)形參的數(shù)據(jù)類型是確定的,而變量是一個(gè)參數(shù),需要的朋友可以參考下

Java反射獲取

獲取類上的泛型

獲取父類定義的泛型

例如現(xiàn)在有一個(gè)父類

public abstract class TestClass<E> {
  ......
}

同時(shí)他有多個(gè)實(shí)現(xiàn)類,如

public class TestStringClass extends TestClass<String>{
  ....
}

public class TestIntegerClass extends TestClass<Integer>{
  ....
}
....

此時(shí)如果要獲取該類上聲明的泛型

需要用到Class類中的getGenericSuperclass方法

getGenericSuperclass方法的作用是:

返回該class所表示的實(shí)體(類、接口、原始類型或void)的直接父類的Type。如果父類是參數(shù)化類型(即有泛型定義),那么返回的Type對(duì)象必須準(zhǔn)確的反應(yīng)源代碼中使用的實(shí)際類型參數(shù)。

如果是帶有泛型的父類,則會(huì)返回ParameterizedType,如果當(dāng)前Class是Object類,接口,原始類型或者void,則會(huì)返回null。

如果此對(duì)象表示數(shù)組類,則返回表示Object類的Class對(duì)象。

ParameterizedType類有3個(gè)方法,其中g(shù)etActualTypeArguments能獲取到泛型列表的數(shù)組。

那么在父類中,如果要獲取子類聲明的泛型類型,就可以使用此方法

Type genericSuperclass = this.getClass().getGenericSuperclass();
if (genericSuperclass instanceof ParameterizedType){
  ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
  Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
  for (Type actualTypeArgument : actualTypeArguments) {
    System.out.println(actualTypeArgument);
  }
}

如此一來(lái),就可以獲取到父類的泛型了。

public abstract class TestClass<E> {

   public void print(){
      Type genericSuperclass = this.getClass().getGenericSuperclass();
      List<Type> list = null;
      if (genericSuperclass instanceof ParameterizedType){
         ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
         Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
         list = Arrays.asList(actualTypeArguments);
      }
      System.out.println(this.getClass() + " 的泛型 = " + list);
   }
}

public class TestStringClass extends TestClass<String>{

    public static void main(String[] args) {
        TestStringClass testStringClass = new TestStringClass();
        testStringClass.print();
    }
}

// class xxx.TestStringClass 的泛型 = [class java.lang.String]

public class TestMapClass extends TestClass<Map<String,String>>{

    public static void main(String[] args) {
        TestMapClass testMapClass = new TestMapClass();
        testMapClass.print();
    }
}

// class xxx.TestMapClass 的泛型 = [java.util.Map<java.lang.String, java.lang.String>]

如果我們想獲取泛型中的泛型,例如上面的TestClass<Map<String,String>>中的Map的泛型。

我們可以看到ParameterizedType有很多實(shí)現(xiàn)類,其中java原生的實(shí)現(xiàn)類為sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl

這個(gè)實(shí)現(xiàn)類中也有一個(gè)actualTypeArguments屬性,也就是說,可以繼續(xù)嘗試獲取泛型列表

獲取接口定義的泛型

很多的接口上也定義了泛型描述,可以通過Class的getGenericInterfaces方法獲取,因?yàn)橐粋€(gè)類可以實(shí)現(xiàn)多個(gè)接口,所以返回了一個(gè)Type數(shù)組,可以遍歷數(shù)組,找到需要處理的接口對(duì)應(yīng)的Type,其余的操作就獲取父類上的泛型操作一致了。

獲取屬性的泛型

獲取屬性的泛型,先通過Class,獲取到需要獲取泛型的Field,然后過個(gè)Field類的getGenericType方法獲取到Type,其余操作與獲取父類上的泛型操作一致。

通過Spring工具類獲取

spring-core工程中,提供了一個(gè)ResolvableType工具類,他可以從屬性、方法參數(shù)、方法返回、類中后去對(duì)應(yīng)的泛型。從Spring4.0開始提供這個(gè)工具類。

常用的方法有

  • forField(Field field) 獲取屬性的泛型
  • forMethodParameter(Method method, int parameterIndex) 獲取方法指定參數(shù)的泛型
  • forMethodReturnType(Method method) 獲取方法返回值的泛型
  • forConstructorParameter(Constructor constructor, int parameterIndex) 獲取構(gòu)造函數(shù)指定參數(shù)的泛型
  • forClass(Class clazz) 獲取class的泛型
  • forType(Type type) 獲取type的泛型
  • forInstance(Object) 通過實(shí)體獲取泛型

官方示例:

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>>
    	// 獲取指定下標(biāo)的泛型類型
      t.getGeneric(0).resolve(); // Integer
      t.getGeneric(1).resolve(); // List
      t.getGeneric(1); // List<String>
    	// 獲取指定下標(biāo)的泛型的指定下標(biāo)的泛型,即獲取嵌套泛型的泛型
      t.resolveGeneric(1, 0); // String
  }

到此這篇關(guān)于Java獲取泛型實(shí)際類型的方法詳解的文章就介紹到這了,更多相關(guān)Java獲取泛型實(shí)際類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)將json數(shù)組轉(zhuǎn)換成對(duì)象列表的三種實(shí)現(xiàn)方法

    Java實(shí)現(xiàn)將json數(shù)組轉(zhuǎn)換成對(duì)象列表的三種實(shí)現(xiàn)方法

    在Java中,將JSON數(shù)組轉(zhuǎn)換為對(duì)象列表通常需要借助第三方JSON處理庫(kù),常用的庫(kù)包括 Jackson、Gson 和 Fastjson,以下是各庫(kù)的詳細(xì)實(shí)現(xiàn)步驟,大家可以根據(jù)需要進(jìn)行選擇
    2025-12-12
  • Java無(wú)法輸出中文問題及解決

    Java無(wú)法輸出中文問題及解決

    這篇文章主要介紹了Java無(wú)法輸出中文問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Spring組件開發(fā)模式支持SPEL表達(dá)式

    Spring組件開發(fā)模式支持SPEL表達(dá)式

    今天小編就為大家分享一篇關(guān)于Spring組件開發(fā)模式支持SPEL表達(dá)式,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • Java?spring注解@PostConstruct實(shí)戰(zhàn)案例講解

    Java?spring注解@PostConstruct實(shí)戰(zhàn)案例講解

    我們?cè)赟pring項(xiàng)目中經(jīng)常會(huì)遇到@PostConstruct注解,可能有的伙伴對(duì)這個(gè)注解很陌生,下面這篇文章主要給大家介紹了關(guān)于Java?spring注解@PostConstruct實(shí)戰(zhàn)案例講解的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • 詳解Java中如何使用JFreeChart生成甘特圖

    詳解Java中如何使用JFreeChart生成甘特圖

    甘特圖是一種流行的項(xiàng)目管理工具,用于顯示項(xiàng)目的進(jìn)度和任務(wù)分配,在Java開發(fā)中,JFreeChart是一個(gè)強(qiáng)大的開源圖表庫(kù),能夠生成各種類型的圖表,下面我們就來(lái)看看如何使用JFreeChart生成甘特圖吧
    2025-01-01
  • java實(shí)現(xiàn)波雷費(fèi)密碼算法示例代碼

    java實(shí)現(xiàn)波雷費(fèi)密碼算法示例代碼

    這篇文章主要介紹了java實(shí)現(xiàn)波雷費(fèi)密碼算法示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • SpringBoot中YAML配置文件實(shí)例詳解

    SpringBoot中YAML配置文件實(shí)例詳解

    前面一直在使用properties配置文件,spring boot也支持yaml配置文件,下面這篇文章主要給大家介紹了關(guān)于SpringBoot中YAML配置文件的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • JAVA基本類型包裝類 BigDecimal BigInteger 的使用

    JAVA基本類型包裝類 BigDecimal BigInteger 的使用

    Java 中預(yù)定義了八種基本數(shù)據(jù)類型,包括:byte,int,long,double,float,boolean,char,short,接下來(lái)文章小編將向大家介紹其中幾個(gè)類型的內(nèi)容,需要的朋友可以參考下文章
    2021-09-09
  • java實(shí)現(xiàn)AES可逆加密算法

    java實(shí)現(xiàn)AES可逆加密算法

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)AES可逆加密算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Java反射之通過反射獲取一個(gè)對(duì)象的方法信息(實(shí)例代碼)

    Java反射之通過反射獲取一個(gè)對(duì)象的方法信息(實(shí)例代碼)

    下面小編就為大家?guī)?lái)一篇Java反射之通過反射獲取一個(gè)對(duì)象的方法信息(實(shí)例代碼)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2016-10-10

最新評(píng)論

瓦房店市| 佛教| 栾川县| 渝中区| 南通市| 甘谷县| 通渭县| 瑞金市| 兰溪市| 剑阁县| 文山县| 开鲁县| 张家口市| 阿拉尔市| 华池县| 镇宁| 佛学| 思南县| 万盛区| 淳安县| 关岭| 香格里拉县| 德阳市| 衡阳县| 甘孜县| 克东县| 嵩明县| 福建省| 册亨县| 临海市| 昌都县| 芜湖县| 屏边| 江山市| 鲁山县| 麻江县| 垣曲县| 江北区| 广南县| 凤冈县| 尉犁县|