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

java怎樣動(dòng)態(tài)獲取泛型參數(shù)的類型

 更新時(shí)間:2024年09月19日 10:30:55   作者:Android海納百川  
在Java中,泛型信息在編譯時(shí)會(huì)被擦除,但可以通過特定API獲取運(yùn)行時(shí)的泛型參數(shù)類型,主要API包括Class的getGenericSuperclass()和getGenericInterfaces()方法,以及ParameterizedType的getActualTypeArguments()方法

Java如何動(dòng)態(tài)獲取泛型參數(shù)的類型

我們都知道java中的泛型其實(shí)是偽泛型,java在編譯階段會(huì)對(duì)變異類型進(jìn)行擦除,擦出到泛型類的最小上限,編譯后得到的class文件里面是沒有任何泛型信息的,泛型的控制其實(shí)就是java編譯器進(jìn)行的控制,編譯階段進(jìn)行泛型檢查。

那如果我們想在運(yùn)行時(shí)知道泛型類的類型,如何做到呢?

主要用到下面幾個(gè)api:

1、public Type getGenericSuperclass()---Class類的方法

2、Type[] getActualTypeArguments()---ParameterizedType方法

3、public Type[] getGenericInterfaces()---Class類的方法

  • 我們先定義一個(gè)泛型類:
public class Father<T> {
}
  • 再定義一個(gè)子類:
public class Son extends Father<String>{
}
  • 先來看看下面代碼:
System.out.println(Son.class.getGenericSuperclass());
System.out.println(Son.class.getSuperclass());
System.out.println(Father.class.getGenericSuperclass());
System.out.println(Father.class.getSuperclass());

運(yùn)行結(jié)果如下:

從上面運(yùn)行結(jié)果可以看出兩點(diǎn):

(1)通過Class類的getGenericSuperclass()是可以獲取到泛型信息的;

(2)泛型類本身是無法獲取到泛型信息的,只能通過泛型類的子類來獲取泛型信息,這也很好解釋,因?yàn)榉盒皖惐热鏔ather類自身,其泛型參數(shù)并未確定,自然無法獲取泛型信息,而子類的泛型參數(shù)類型已經(jīng)確定,父類泛型信息已經(jīng)確定,所以可以查詢。

具體的查詢泛型參數(shù)類型的代碼如下:

ParameterizedType parameterizedType = (ParameterizedType) Son.class.getGenericSuperclass();
System.out.println(parameterizedType.getClass().getName());
System.out.println(parameterizedType);
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
for(Type actualTypeArgument: actualTypeArguments) {
    System.out.println(actualTypeArgument.getClass().getName());  
	System.out.println(actualTypeArgument); 
} 

運(yùn)行結(jié)果如下:

由上圖運(yùn)行結(jié)果可知:

(1)getGenericSuperclass()返回的實(shí)際類型為ParameterizedTypeImpl,這里面帶有父類的泛型類型信息;

(2)獲取泛型參數(shù)信息是通過ParameterizedType的getActualTypeArguments方法,該方法返回的是一個(gè)Type類型的數(shù)據(jù),該數(shù)據(jù)存放的數(shù)據(jù)的實(shí)際類型為Class,也就是我們得到了泛型參數(shù)的類信息。

上面講述的是獲取父類的泛型類型,那接口的泛型類型如何獲取呢?

  • 先貼一個(gè)簡單的接口:
public interface ITest<T> {
}
  • 我們讓Son類實(shí)現(xiàn)該方法:
public class Son extends Father<String> implements ITest<Integer>{
}
  • 獲取ITest的泛型參數(shù)類型的方法如下:
ParameterizedType parameterizedType = (ParameterizedType) Son.class.getGenericInterfaces()[0];
System.out.println(parameterizedType.getClass().getName());
System.out.println(parameterizedType);
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
for(Type actualTypeArgument: actualTypeArguments) { 
	System.out.println(actualTypeArgument.getClass().getName());
	System.out.println(actualTypeArgument); 
} 

運(yùn)行結(jié)果如下:

和泛型類區(qū)別就是getGenericSuperclass()方法換成了getGenericInterfaces(),getGenericInterfaces()方法返回的是Type[],因?yàn)橐粋€(gè)類可以實(shí)現(xiàn)多個(gè)接口,所以想要獲取哪個(gè)接口的泛型信息,需要指定數(shù)據(jù)下標(biāo),這里Son類就實(shí)現(xiàn)了一個(gè)接口,所以直接Son.class.getGenericInterfaces()[0]就可以了。

上面的代碼有一個(gè)共同點(diǎn)

就是泛型類或者泛型接口已經(jīng)有一個(gè)子類了,通過子類的Class信息可以獲取到泛型父類或者泛型接口的泛型類型信息,那么如果沒有子類,怎么直接獲取泛型類的泛型類型信息呢?

很簡單,通過匿名內(nèi)部類(其實(shí)還是通過子類).

new Father<Integer>() {}.getClass().getGenericSuperclass();
new ITest<Integer>() {}.getClass().getGenericInterfaces())[0];

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

肥乡县| 河间市| 稷山县| 体育| 东海县| 霍城县| 砀山县| 盈江县| 临安市| 勐海县| 华阴市| 延津县| 大同市| 金华市| 米泉市| 太仆寺旗| 泗洪县| 西贡区| 丹凤县| 张掖市| 临泽县| 花莲市| 平遥县| 黔南| 富宁县| 乡城县| 鹿泉市| 新宁县| 高要市| 康马县| 安新县| 屯留县| 黔江区| 湟中县| 莱西市| 衡南县| 霍山县| 汝州市| 临桂县| 广州市| 平阳县|