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

關于Java反射給泛型集合賦值問題

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

泛型

Java泛型簡單描述下:

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

List<Student> studentList = new ArrayList();

這個時候List里面就只能放入Student類型的值,如果強行放入其他類型(比如說Integer)的就會提示錯誤信息:

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

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

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

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

原代碼類似于:

Student student = studentList.get(0);

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

這個時候又得提出一個概念:

反射

比較全面的解釋:

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

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

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

差不多就這樣子,入參是[1,2,3,4]和studentList,在外邊取list中的值時,發(fā)現:

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

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

其實剛開始碰到時,一臉懵的,耗費了很長時間取排查問題,我泛型Student的List,怎么會出現這種問題,從List中取出來的值不能轉換成Student。。。。

不過后來發(fā)現原因之后,感覺其實也不復雜,挺簡單的,還是經驗太少,判斷錯誤能力不行,共勉。

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

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

相關文章

最新評論

陕西省| 无棣县| 海林市| 当雄县| 大冶市| 垦利县| 马山县| 吉安市| 弋阳县| 云龙县| 罗城| 泗洪县| 东乌珠穆沁旗| 清水河县| 石楼县| 丹凤县| 易门县| 布拖县| 诸暨市| 湖州市| 富源县| 通城县| 深州市| 大化| 曲松县| 桃江县| 裕民县| 蒲城县| 长垣县| 梁河县| 房产| 彭泽县| 雷山县| 牡丹江市| 东光县| 清镇市| 抚顺县| 东至县| 纳雍县| 丘北县| 巴中市|