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

Java如何獲得泛型類中的泛型類型T.class

 更新時(shí)間:2024年12月14日 15:37:05   作者:nvd11  
獲取泛型符號(hào)E的Class對(duì)象的方法,1.反射方案利用匿名子類實(shí)例化,但該方法有特殊限制,2.反射方案2直接指定泛型類型,但不靈活,3.構(gòu)造方法方案在初始化時(shí)傳入泛型類,但有寫(xiě)錯(cuò)風(fēng)險(xiǎn)

Java獲得泛型類的泛型類型T.class

假如我們寫(xiě)了1個(gè)泛型類MyBase

public class MyBase<E> {
    public MyBase(){
        
    }

    public Class<?> getEClass() {
		?
    }   
}

我想寫(xiě)1個(gè)getEClass 的方法, 獲取泛型符號(hào)E的Class對(duì)象。

直接用E.class E.getClass()都是不合法的, 因?yàn)镋只是個(gè)符號(hào), 沒(méi)有被實(shí)例化。

1. 反射方案

各種google 各種Stackoverflow 后, 找到利用反射的1個(gè)方法。

public class MyBase<E> {
    public MyBase(){
        
    }

    public Class<?> getEClass() {
        
        //get the Class object of this own class 
        Class<? extends MyBase> thisClass = this.getClass();

        //get the Type Object of supper class
        Type superClassType = thisClass.getGenericSuperclass();
        ParameterizedType pt = (ParameterizedType)superClassType;

        //get the Generic Type array
        Type[] genTypeArr = pt.getActualTypeArguments();
        Type genType = genTypeArr[0];
        if (false == genType instanceof Class){
            return Object.class;
        }

        return (Class<Object>) genType;
    }
}

這個(gè)方法被測(cè)試過(guò), 但是有個(gè)很特別的限制,

一定要實(shí)例化匿名子類才有效果。

例如:

   @Test
    void testMyBase() {
        MyBase<String> mybase = new MyBase<String>(){};
        log.info("E class is {}",mybase.getEClass());
    }

注意new MyBase(){} 后面的大括號(hào), 意思不是實(shí)例化MyBase對(duì)象, 而是實(shí)例化MyBase的匿名子類。

如果我們寫(xiě)多1個(gè)具體的子類MyList

public class MyList<E> extends MyBase<E> {
    public MyList(){

	}
}

測(cè)試方法:

   @Test
    void testGetEClass() {
        MyList<String> mylist = new MyList<String>();
        log.info("E class is {}",mylist.getEClass());
    }

同樣不行, 原因是

		//get the Type Object of supper class
        Type superClassType = thisClass.getGenericSuperclass();
        ParameterizedType pt = (ParameterizedType)superClassType;

這里 我們只能通過(guò)本類的Class對(duì)象去獲得1個(gè)父類 ParameterizedType (包括泛型參數(shù)列表的Type)

而JDK本身只提供了getGenericSuperclass()方法去獲得父類的Type 對(duì)象

但是沒(méi)有提供例如getGenericClass() 去獲取本類的Type對(duì)象…

所以一旦我們不實(shí)用匿名子類

當(dāng)下面代碼被執(zhí)行時(shí)

MyList<String> mylist = new MyList<String>();
log.info("E class is {}",mylist.getEClass());

thisClass.getGenericSuperclass() 會(huì)獲得MyList的父類MyBase的Type, 問(wèn)題是MyBase沒(méi)有被實(shí)例化, 所以pt.getActualTypeArguments()[0] 只會(huì)返回E

本身 就return null了

但是如果我們利用匿名子類的化

當(dāng)下面代碼被執(zhí)行時(shí)

MyList<String> mylist = new MyList<String>(){};
log.info("E class is {}",mylist.getEClass());

mylist 的類實(shí)際上是1個(gè)匿名子類MyList$1, 它的父類就是MyList, 而匿名子類的父類在JVM實(shí)際上是被實(shí)例化的

所以pt.getActualTypeArguments()[0] 會(huì)返回泛型具體類String 的Class。

2. 反射方案2

匿名子類畢竟有點(diǎn)奇怪。

如果避免使用你匿名子類, 我們還有1個(gè)辦法

public class MySet extends MyBase<String> {
    public MySet(){
  
    }
}

如上面這個(gè)MySet類, 它直接繼承MyBase時(shí)指定了具體泛型, 令到自己本身不是1個(gè)泛型類。

這樣的話, 不用匿名子類也一樣可以獲得泛型具體類型。

因?yàn)檫@種情況下, 一旦實(shí)現(xiàn)MySet, 因?yàn)镸ySet指定了繼承泛型的具體類型, 在JVM 中MyBase也會(huì)被實(shí)例化。

但是這個(gè)方案一樣不好, 不靈活是其次, 我都會(huì)指定了具體泛型類型了, 何必用再用getEClass()去獲得泛型具體類型? 多次一舉

  @Test
    void testGetEClass2() {
        MySet myset = new MySet();
        log.info("Set E class is {}",myset.getEClass());
    }

3. 構(gòu)造方法方案

這也是外網(wǎng)強(qiáng)烈推薦的方案

public class MyMap<E> {

    private Class<E> eClass;

    public MyMap(Class<E> eClass){
        this.eClass = eClass;
    }

    public Class<E> getEClass(){
        return this.eClass;
    }

}

讓開(kāi)發(fā)人員在初始化時(shí),順便外部傳入泛型的類, 不過(guò)手抖寫(xiě)錯(cuò)的風(fēng)險(xiǎn)…

測(cè)試方法:

  @Test
    void testGetEClass3() {
        MyMap<String> myMap= new MyMap<>(String.class);
        log.info("Set E class is {}",myMap.getEClass());
    }
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java基于Apache FTP實(shí)現(xiàn)文件上傳、下載、修改文件名、刪除

    java基于Apache FTP實(shí)現(xiàn)文件上傳、下載、修改文件名、刪除

    本篇文章主要介紹了Apache FTP實(shí)現(xiàn)文件上傳、下載、修改文件名、刪除,實(shí)現(xiàn)了FTP文件上傳(斷點(diǎn)續(xù)傳)、FTP文件下載、FTP文件重命名、FTP文件刪除等功能,有需要的可以了解一下。
    2016-11-11
  • 帶你深入理解MyBatis緩存機(jī)制

    帶你深入理解MyBatis緩存機(jī)制

    緩存是一般的ORM框架都會(huì)提供的功能,目的就是提升查詢的效率和減少數(shù)據(jù)庫(kù)的壓力,跟Hibernate 一樣,MyBatis 也有一級(jí)緩存和二級(jí)緩存,并且預(yù)留了集成第三方緩存的接口,這篇文章主要給大家介紹了關(guān)于MyBatis緩存機(jī)制的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • java的Jackson框架實(shí)現(xiàn)輕易轉(zhuǎn)換JSON

    java的Jackson框架實(shí)現(xiàn)輕易轉(zhuǎn)換JSON

    本篇文章主要介紹了java的Jackson框架實(shí)現(xiàn)輕易轉(zhuǎn)換JSON,Jackson將Java對(duì)象轉(zhuǎn)換成json對(duì)象和xml文檔,同樣也可以將json、xml轉(zhuǎn)換成Java對(duì)象,有興趣的可以了解一下。
    2017-02-02
  • 解讀maven項(xiàng)目中Tomcat10與JSTL的問(wèn)題匯總(Debug親身經(jīng)歷)

    解讀maven項(xiàng)目中Tomcat10與JSTL的問(wèn)題匯總(Debug親身經(jīng)歷)

    這篇文章主要介紹了解讀maven項(xiàng)目中Tomcat10與JSTL的問(wèn)題匯總(Debug親身經(jīng)歷),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot詳細(xì)介紹SPI機(jī)制示例

    SpringBoot詳細(xì)介紹SPI機(jī)制示例

    這篇文章主要介紹了深入解析Spring Boot的SPI機(jī)制詳情,SPI是JDK內(nèi)置的一種服務(wù)提供發(fā)現(xiàn)機(jī)制,可以用來(lái)啟用框架擴(kuò)展和替換組件,主要用于框架中開(kāi)發(fā),更多相關(guān)介紹,感興趣的小伙伴可以參考一下下面文章內(nèi)容
    2022-08-08
  • spring boot中的properties參數(shù)配置詳解

    spring boot中的properties參數(shù)配置詳解

    這篇文章主要介紹了spring boot中的properties參數(shù)配置,需要的朋友可以參考下
    2017-09-09
  • 新版IDEA使用Spring Initializr創(chuàng)建工程的兩種方法

    新版IDEA使用Spring Initializr創(chuàng)建工程的兩種方法

    這篇文章主要介紹了新版IDEA使用Spring Initializr創(chuàng)建工程(兩種方法,官方工具和IDEA),文中通過(guò)代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-10-10
  • Java實(shí)現(xiàn)汽車租賃系統(tǒng)

    Java實(shí)現(xiàn)汽車租賃系統(tǒng)

    這篇文章介紹了Java實(shí)現(xiàn)汽車租賃系統(tǒng)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • macOS查看與安裝Java JDK的完整步驟

    macOS查看與安裝Java JDK的完整步驟

    本文詳細(xì)介紹了在macOS上查看、安裝、配置和管理Java JDK的步驟,包括使用官網(wǎng)下載、Homebrew、SDKMAN和IntelliJ IDEA內(nèi)置JDK等方法,同時(shí),還涵蓋了環(huán)境變量配置、多版本管理以及常見(jiàn)問(wèn)題解決等,需要的朋友可以參考下
    2026-03-03
  • IDEA創(chuàng)建Java項(xiàng)目保姆級(jí)教程(超詳細(xì)!)

    IDEA創(chuàng)建Java項(xiàng)目保姆級(jí)教程(超詳細(xì)!)

    這篇文章主要給大家介紹了關(guān)于IDEA創(chuàng)建Java項(xiàng)目保姆級(jí)教程的相關(guān)資料,Java是一種廣泛使用的編程語(yǔ)言,廣泛用于Web應(yīng)用程序和客戶端應(yīng)用程序的開(kāi)發(fā),文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09

最新評(píng)論

万年县| 顺平县| 确山县| 中牟县| 泸西县| 睢宁县| 安达市| 临沭县| 泗水县| 惠水县| 西畴县| 金川县| 蕉岭县| 卫辉市| 湖州市| 金坛市| 盘山县| 兰坪| 温宿县| 定日县| 腾冲县| 海门市| 玉门市| 修水县| 达日县| 什邡市| 行唐县| 通山县| 红河县| 澜沧| 林甸县| 老河口市| 屏东市| 九台市| 张家港市| 牟定县| 永靖县| 甘孜| 井陉县| 饶阳县| 沧源|