Java反射給泛型集合賦值


Java反射給泛型集合賦值

泛型

Java泛型簡單描述下:

比如創建一個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類型的值,沒有什么問題。

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

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

原代碼類似於:

Student student = studentList.get(0);

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

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

反射

比較全面的解釋:

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

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

    public List testReflect(Object arg[], List list) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        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中的值時,發現:

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

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

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM