欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于Java反射給泛型集合賦值問題

 更新時(shí)間:2022年01月14日 16:51:16   作者:柳先開  
這篇文章主要介紹了Java反射給泛型集合賦值,需要的朋友可以參考下

泛型

Java泛型簡(jiǎn)單描述下:

比如創(chuàng)建一個(gè)List集合,我想在里邊只放Student對(duì)象信息,就需要寫成

List<Student> studentList = new ArrayList();

這個(gè)時(shí)候List里面就只能放入Student類型的值,如果強(qiáng)行放入其他類型(比如說Integer)的就會(huì)提示錯(cuò)誤信息:

java.lang.ClassCastException: java.lang.Integer cannot be cast to com.entity.Student

按照這個(gè)結(jié)果來看,studentList里面就只能放入Student類型的值,沒有什么問題。

然后,奇怪的事情發(fā)生了,在公司項(xiàng)目的log里發(fā)現(xiàn)了一個(gè)error:

java.lang.ClassCastException: java.lang.Integer cannot be cast to com.entity.Student

原代碼類似于:

Student student = studentList.get(0);

What? 集合創(chuàng)建的時(shí)候明明給的泛型是Student啊,這個(gè)String是哪蹦出來的。

這個(gè)時(shí)候又得提出一個(gè)概念:

反射

比較全面的解釋:

JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語言的反射機(jī)制。
要想解剖一個(gè)類,必須先要獲取到該類的字節(jié)碼文件對(duì)象。而解剖使用的就是Class類中的方法.所以先要獲取到每一個(gè)字節(jié)碼文件對(duì)應(yīng)的Class類型的對(duì)象.

一通debug,我發(fā)現(xiàn)了這么一段代碼(來自于hutools包內(nèi)的某個(gè)方法中,詳細(xì)是哪個(gè)記不太清了,模仿著寫寫):

    Class<? extends List> aClass = list.getClass();
        Method method = aClass.getMethod("add", Object.class);
        for (Object o : arg) {
            method.invoke(list, o);
        }
        return list;
    }

差不多就這樣子,入?yún)⑹荹1,2,3,4]和studentList,在外邊取list中的值時(shí),發(fā)現(xiàn):

java.lang.ClassCastException: java.lang.Integer cannot be cast to com.entity.Student

這玩意,利用反射獲取了List的add方法,值類型也不判斷,直接給塞進(jìn)集合里了。。。。

其實(shí)剛開始碰到時(shí),一臉懵的,耗費(fèi)了很長(zhǎng)時(shí)間取排查問題,我泛型Student的List,怎么會(huì)出現(xiàn)這種問題,從List中取出來的值不能轉(zhuǎn)換成Student。。。。

不過后來發(fā)現(xiàn)原因之后,感覺其實(shí)也不復(fù)雜,挺簡(jiǎn)單的,還是經(jīng)驗(yàn)太少,判斷錯(cuò)誤能力不行,共勉。

上面的代碼用的Student類和String、Integer代替,公司內(nèi)部代碼就不透露了。

到此這篇關(guān)于Java反射給泛型集合賦值的文章就介紹到這了,更多相關(guān)Java反射給泛型集合賦值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javaweb中Filter(過濾器)的常見應(yīng)用

    javaweb中Filter(過濾器)的常見應(yīng)用

    這篇文章主要介紹了javaweb中Filter的常見應(yīng)用,過濾器的使用方法,感興趣的小伙伴們可以參考一下
    2015-12-12
  • Kafka單節(jié)點(diǎn)偽分布式集群搭建實(shí)現(xiàn)過程詳解

    Kafka單節(jié)點(diǎn)偽分布式集群搭建實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了Kafka單節(jié)點(diǎn)偽分布式集群搭建實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 使用springmvc的controller層獲取到請(qǐng)求的數(shù)據(jù)方式

    使用springmvc的controller層獲取到請(qǐng)求的數(shù)據(jù)方式

    這篇文章主要介紹了使用springmvc的controller層獲取到請(qǐng)求的數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot枚舉類型參數(shù)認(rèn)證的實(shí)現(xiàn)代碼

    SpringBoot枚舉類型參數(shù)認(rèn)證的實(shí)現(xiàn)代碼

    項(xiàng)目當(dāng)中經(jīng)常需要接口參數(shù)是否在一個(gè)可選的范圍內(nèi),也就是驗(yàn)證類枚舉參數(shù)的需求,所以本文我們將使用SpringBoot實(shí)現(xiàn)枚舉類型參數(shù)認(rèn)證,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-12-12
  • java中封裝JDBC工具類的實(shí)例分析

    java中封裝JDBC工具類的實(shí)例分析

    在本篇內(nèi)容里小編給各位分享了一篇關(guān)于java中封裝JDBC工具類的實(shí)例分析,對(duì)此有興趣的朋友們可以學(xué)習(xí)下。
    2021-03-03
  • common-upload上傳文件功能封裝類分享

    common-upload上傳文件功能封裝類分享

    本文介紹一個(gè)common-upload上傳封裝類,為了更方便的上傳文件,對(duì)common-upload進(jìn)行了一個(gè)簡(jiǎn)單的封裝,大家參考使用吧
    2014-01-01
  • Java中覆蓋finalize()方法實(shí)例代碼

    Java中覆蓋finalize()方法實(shí)例代碼

    這篇文章主要介紹了Java中覆蓋finalize()方法實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • ehcache模糊批量移除緩存的方法

    ehcache模糊批量移除緩存的方法

    本篇文章主要介紹了ehcache模糊批量移除緩存的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • Mybatis之@ResultMap,@Results,@Result注解的使用

    Mybatis之@ResultMap,@Results,@Result注解的使用

    這篇文章主要介紹了Mybatis之@ResultMap,@Results,@Result注解的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 詳解Java中的final關(guān)鍵字

    詳解Java中的final關(guān)鍵字

    子類可以在父類的基礎(chǔ)上改寫父類內(nèi)容,為了避免這種隨意改寫的情況,Java提供了final 關(guān)鍵字,用于修飾不可改變內(nèi)容。本文就來詳細(xì)說說final關(guān)鍵字的使用,需要的可以參考一下
    2022-10-10

最新評(píng)論