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

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

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

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

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

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

主要用到下面幾個api:

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

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

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

  • 我們先定義一個泛型類:
public class Father<T> {
}
  • 再定義一個子類:
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方法,該方法返回的是一個Type類型的數(shù)據(jù),該數(shù)據(jù)存放的數(shù)據(jù)的實(shí)際類型為Class,也就是我們得到了泛型參數(shù)的類信息。

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

  • 先貼一個簡單的接口:
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)橐粋€類可以實(shí)現(xiàn)多個接口,所以想要獲取哪個接口的泛型信息,需要指定數(shù)據(jù)下標(biāo),這里Son類就實(shí)現(xiàn)了一個接口,所以直接Son.class.getGenericInterfaces()[0]就可以了。

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

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

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

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

總結(jié)

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

相關(guān)文章

最新評論

大港区| 固安县| 清涧县| 湖北省| 青田县| 邓州市| 苍梧县| 都匀市| 瑞丽市| 大埔县| 金寨县| 疏勒县| 贵港市| 拜泉县| 临沧市| 乾安县| 富源县| 宿松县| 庄浪县| 金华市| 互助| 永善县| 吴忠市| 井冈山市| 乌拉特后旗| 呼伦贝尔市| 井冈山市| 德兴市| 班玛县| 抚州市| 兴宁市| 禹州市| 西充县| 汕尾市| 霍州市| 饶河县| 江城| 南阳市| 阿克| 余姚市| 稷山县|