Java使用反射獲取list泛型過程淺析
通過屬性來獲取泛型的類型
Field[] fields = bean.getClass().getDeclaredFields(); for(Field f : fields){ f.setAccessible(true); if(f.getType() == java.util.List.class){ // 如果是List類型,得到其Generic的類型 Type genericType = f.getGenericType(); if(genericType == null) continue; // 如果是泛型參數(shù)的類型 if(genericType instanceof ParameterizedType){ ParameterizedType pt = (ParameterizedType) genericType; //得到泛型里的class類型對(duì)象 Class<?> genericClazz = (Class<?>)pt.getActualTypeArguments()[0]; } }
通過class對(duì)象來獲取泛型類型
Type type = getClass().getGenericSuperclass(); System.err.println("generic super class type:" + type); Type trueType = ((ParameterizedType) type).getActualTypeArguments()[0]; //trueType就是泛型的真實(shí)類型
一、getSuperclass 返回直接繼承的父類(由于編譯擦除,沒有顯示泛型參數(shù))
二、getGenericSuperclass 返回直接繼承的父類(包含泛型參數(shù))
返回表示此 Class 所表示的實(shí)體(類、接口、基本類型或 void)的直接超類的 Type。
如果超類是參數(shù)化類型,則返回的 Type 對(duì)象必須準(zhǔn)確反映源代碼中所使用的實(shí)際類型參數(shù)。如果以前未曾創(chuàng)建表示超類的參數(shù)化類型,則創(chuàng)建這個(gè)類型。有關(guān)參數(shù)化類型創(chuàng)建過程的語義,請(qǐng)參閱 ParameterizedType 聲明。
如果此 Class 表示 Object 類、接口、基本類型或 void,則返回 null。
如果此對(duì)象表示一個(gè)數(shù)組類,則返回表示 Object 類的 Class 對(duì)象。
列如
package cn.test; public class Test { public static void main(String[] args) { System.out.println("Student.class.getSuperclass()\t" + Student.class.getSuperclass()); System.out.println("Student.class.getGenericSuperclass()\t" + Student.class.getGenericSuperclass()); System.out.println("Test.class.getSuperclass()\t" + Test.class.getSuperclass()); System.out.println("Test.class.getGenericSuperclass()\t" + Test.class.getGenericSuperclass()); System.out.println("Object.class.getGenericSuperclass()\t" + Object.class.getGenericSuperclass()); System.out.println("Object.class.getSuperclass()\t" + Object.class.getSuperclass()); System.out.println("void.class.getSuperclass()\t" + void.class.getSuperclass()); System.out.println("void.class.getGenericSuperclass()\t" + void.class.getGenericSuperclass()); System.out.println("int[].class.getSuperclass()\t" + int[].class.getSuperclass()); System.out.println("int[].class.getGenericSuperclass()\t" + int[].class.getGenericSuperclass()); } } class Person<T> { } class Student extends Person<Test> { }
輸出結(jié)果:
Student.class.getSuperclass() class cn.test.Person Student.class.getGenericSuperclass() cn.test.Person<cn.test.Test> Test.class.getSuperclass() class java.lang.Object Test.class.getGenericSuperclass() class java.lang.Object Object.class.getGenericSuperclass() null Object.class.getSuperclass() null void.class.getSuperclass() null void.class.getGenericSuperclass() null int[].class.getSuperclass() class java.lang.Object int[].class.getGenericSuperclass() class java.lang.Object
到此這篇關(guān)于Java使用反射獲取list泛型過程淺析的文章就介紹到這了,更多相關(guān)Java反射獲取list泛型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(44)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07SpringMVC實(shí)現(xiàn)前端后臺(tái)交互傳遞數(shù)據(jù)
本篇文章主要介紹了SpringMVC實(shí)現(xiàn)前端后臺(tái)傳遞數(shù)據(jù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03解決springboot+activemq啟動(dòng)報(bào)注解錯(cuò)誤的問題
這篇文章主要介紹了解決springboot+activemq啟動(dòng)報(bào)注解錯(cuò)誤的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot實(shí)現(xiàn)文件的上傳、下載和預(yù)覽功能
在Spring Boot項(xiàng)目中實(shí)現(xiàn)文件的上傳、下載和預(yù)覽功能,可以通過使用Spring MVC的MultipartFile接口來處理文件上傳,并使用HttpServletResponse或Resource來實(shí)現(xiàn)文件下載和預(yù)覽,下面是如何實(shí)現(xiàn)這些功能的完整示例,需要的朋友可以參考下2024-08-08基于java構(gòu)造方法Vector創(chuàng)建對(duì)象源碼分析
這篇文章主要介紹了java構(gòu)造函數(shù)中對(duì)Vector源碼及原理的分析,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家早日升職加薪2021-09-092023最新版IDEA創(chuàng)建javaweb項(xiàng)目的詳細(xì)圖文教程
之前用的社區(qū)版IDEA無法部署JavaWeb項(xiàng)目,于是裝了一個(gè)最新版的IDEA,下面這篇文章主要給大家介紹了關(guān)于2023最新版IDEA創(chuàng)建javaweb項(xiàng)目的詳細(xì)圖文教程,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06java中struts2實(shí)現(xiàn)簡(jiǎn)單的文件上傳與下載
這篇文章主要為大家詳細(xì)介紹了java中struts2實(shí)現(xiàn)簡(jiǎn)單的文件上傳與下載的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-05-05