關(guān)于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
按照這個結(jié)果來看,studentList里面就只能放入Student類型的值,沒有什么問題。
然后,奇怪的事情發(fā)生了,在公司項目的log里發(fā)現(xiàn)了一個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)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制。
要想解剖一個類,必須先要獲取到該類的字節(jié)碼文件對象。而解剖使用的就是Class類中的方法.所以先要獲取到每一個字節(jié)碼文件對應(yīng)的Class類型的對象.
一通debug,我發(fā)現(xiàn)了這么一段代碼(來自于hutools包內(nèi)的某個方法中,詳細是哪個記不太清了,模仿著寫寫):
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中的值時,發(fā)現(xiàn):
java.lang.ClassCastException: java.lang.Integer cannot be cast to com.entity.Student
這玩意,利用反射獲取了List的add方法,值類型也不判斷,直接給塞進集合里了。。。。
其實剛開始碰到時,一臉懵的,耗費了很長時間取排查問題,我泛型Student的List,怎么會出現(xiàn)這種問題,從List中取出來的值不能轉(zhuǎn)換成Student。。。。
不過后來發(fā)現(xiàn)原因之后,感覺其實也不復(fù)雜,挺簡單的,還是經(jīng)驗太少,判斷錯誤能力不行,共勉。
上面的代碼用的Student類和String、Integer代替,公司內(nèi)部代碼就不透露了。
到此這篇關(guān)于Java反射給泛型集合賦值的文章就介紹到這了,更多相關(guān)Java反射給泛型集合賦值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javaweb中Filter(過濾器)的常見應(yīng)用
這篇文章主要介紹了javaweb中Filter的常見應(yīng)用,過濾器的使用方法,感興趣的小伙伴們可以參考一下2015-12-12Kafka單節(jié)點偽分布式集群搭建實現(xiàn)過程詳解
這篇文章主要介紹了Kafka單節(jié)點偽分布式集群搭建實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11使用springmvc的controller層獲取到請求的數(shù)據(jù)方式
這篇文章主要介紹了使用springmvc的controller層獲取到請求的數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08SpringBoot枚舉類型參數(shù)認證的實現(xiàn)代碼
項目當中經(jīng)常需要接口參數(shù)是否在一個可選的范圍內(nèi),也就是驗證類枚舉參數(shù)的需求,所以本文我們將使用SpringBoot實現(xiàn)枚舉類型參數(shù)認證,文中有詳細的代碼示例,需要的朋友可以參考下2023-12-12Mybatis之@ResultMap,@Results,@Result注解的使用
這篇文章主要介紹了Mybatis之@ResultMap,@Results,@Result注解的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12