亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java 運行時如何獲取泛型參數的類型

2019-11-11 07:51:15
字體:
來源:轉載
供稿:網友

java 中對于下面最簡單的泛型類

class A<T> {	public void foo() {		//如何在此處獲得運行時 T 的具體類型呢?	}}

設想我們使用時

new A<String>().foo();

是否能在 foo() 方法中獲得當前的類型是 String 呢?答案是否定的,不能。在 foo() 方法中 this 引用給不出類型信息, this.getClass() 就更不可能了,因為 Java 的泛型不等同于 C++ 的模板類, this.getClass() 實例例是被所有的不同具體類型的 A 實例(new A<String>(), new A<Integer>() 等) 共享的,所以在字節碼中類型會被擦除到上限。

我們可以在 IDE 的調試時看到這個泛型類的簽名

或者用 javap -v cc.unmi.A 可以查看到類 A 的泛型簽名

Signature: #17                          // <T:Ljava/lang/Object;>Ljava/lang/Object;

為什么說是擦除到上限呢?并不是泛型在字節碼中都表示為 Object , 看下面的例子,假如 A 聲明如下

class A<T extends Number> {

}

再用 javap -v cc.unmi.A 來看泛型簽名

Signature: #18                          // <T:Ljava/lang/Number;>Ljava/lang/Object;

也就是說在上面的 foo() 方法中無法獲得當前的類型,我們必須給它加個參數 T

public void foo(T t) {

t.getClass();

}

了解了 Java 泛型機制是如何擦除類型的,我們接下來的問題就是如何通過反射獲得泛型簽名中的類型,一般會在繼承或實現泛型接口時會用到它。

繼承一個泛型基類
class A<T, ID> {}class B extends A<String, Integer> {}public class Generic {    public static void main(String[] args) {        System.out.PRintln(B.class.getGenericSuperclass());    }}

上面的代碼輸出是

cc.unmi.A<java.lang.String, java.lang.Integer>

所以要獲得這兩個類型是可行的,設置了斷點

這張圖可以看到 B.class.getGenericSuperclass() 得到的實際類型是 ParameterizedTypeImpl 通過它就可以獲得 actualTypeArguments 了。代碼就是

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

上面的代碼輸出

class java.lang.String

class java.lang.Integer

我們不妨用 javap -v cc.unmi.B 的泛型簽名

Signature: #12                          // Lcc/unmi/A<Ljava/lang/String;Ljava/lang/Integer;>;

實現一個泛型接口

這時與繼承一個泛型基類的情況略有不同,如下關系,A 是一個泛型接口

interface A<T, ID> {}class B implements A<String, Integer> {}

該如何反射獲得 B 的參數類型呢,用上面的方法已不可行, B.class.getGenericSuperclass() 已不是一個 ParameterizedTypeImpl 而是一個 Object 類型?,F在需要另一個方法 getGenericInterfaces(): Type[] 它得到一個 Type 數組,代表類實現的多個接口,因為我們這兒只實現了一個接口,所以取第一個元素,它的類型是我們已見過的 ParameterizedTypeImpl ,

因此我們用來獲得實現接口而來的泛型參數的代碼就是

ParameterizedType parameterizedType = (ParameterizedType) B.class.getGenericInterfaces()[0];Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();for (Type actualTypeArgument : actualTypeArguments) {    System.out.println(actualTypeArgument);}

同樣能得到上面的一樣的結果。

總結一下

如果是繼承基類而來的泛型,就用 getGenericSuperclass() , 轉型為 ParameterizedType 來獲得實際類型如果是實現接口而來的泛型,就用 getGenericInterfaces() , 針對其中的元素轉型為 ParameterizedType 來獲得實際類型我們所說的 Java 泛型在字節碼中會被擦除,并不總是擦除為 Object 類型,而是擦除到上限類型能否獲得想要的類型可以在 IDE 中,或用 javap -v <your_class>   來查看泛型簽名來找到線索
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产天堂久久综合网| 日韩av在线直播| 欧美电影电视剧在线观看| 亚洲一区二区久久久| 中文字幕亚洲自拍| 国产成人精品电影久久久| 欧美一级成年大片在线观看| 亚洲一区二区三区视频播放| 在线成人激情视频| 亚洲a区在线视频| 国产精品影院在线观看| 国产精品第100页| 色阁综合伊人av| 日韩欧美国产高清91| 黑人精品xxx一区| 久久激情视频免费观看| 成人亚洲综合色就1024| 久久成人亚洲精品| 精品国产依人香蕉在线精品| 日韩在线免费视频观看| 91视频国产高清| 亚洲男女性事视频| 亚洲一区久久久| 国产91精品青草社区| 欧美中文在线字幕| 成人精品在线观看| 91丨九色丨国产在线| 欧美成人在线影院| 中文字幕久久久av一区| 中文字幕最新精品| 欧美激情视频网址| 欧美日韩成人网| 97激碰免费视频| 久久精品亚洲94久久精品| 亚洲人成电影网站色| 欧美一区二区色| 国产精品亚洲激情| 国外成人性视频| 正在播放亚洲1区| 91精品综合久久久久久五月天| 欧美日韩亚洲一区二| 亚洲国产成人久久| 国产精品午夜国产小视频| 欧美性生交大片免费| 97国产精品视频人人做人人爱| 国产精品香蕉在线观看| 欧美成年人视频| 亚洲欧美变态国产另类| 亚洲国产又黄又爽女人高潮的| 国产激情综合五月久久| 欧美超级免费视 在线| 欧美国产日韩一区二区| 国产网站欧美日韩免费精品在线观看| 久久久久久中文| 精品国产视频在线| 日本国产高清不卡| 国产97在线亚洲| 久99九色视频在线观看| 亚洲黄色av女优在线观看| 亚洲精选在线观看| 亚洲欧美激情四射在线日| 日韩久久免费电影| 精品国内产的精品视频在线观看| 亚洲欧洲日产国码av系列天堂| 日韩美女激情视频| 92国产精品久久久久首页| 成人福利在线视频| 国产精品成人久久久久| 国产精品v片在线观看不卡| www.xxxx精品| 亚洲国产99精品国自产| 九九视频这里只有精品| 一区二区亚洲精品国产| 欧美福利视频网站| 国产日韩欧美中文在线播放| 亚洲国产精品美女| 日韩av成人在线| 亚洲欧洲视频在线| 91精品久久久久久| 精品福利樱桃av导航| 日韩av中文字幕在线| 欧美最猛性xxxxx免费| 精品无人国产偷自产在线| 亚洲欧洲日产国码av系列天堂| 美女福利视频一区| 97涩涩爰在线观看亚洲| 夜夜嗨av色一区二区不卡| 色老头一区二区三区在线观看| 亚洲一区二区免费| 欧美有码在线观看| 国产日韩综合一区二区性色av| 7777精品视频| 国产一区av在线| 色噜噜狠狠狠综合曰曰曰88av| 久久999免费视频| 国产精品丝袜高跟| 国产精品中文久久久久久久| 欧美性感美女h网站在线观看免费| 成人黄色免费在线观看| 亚洲免费av电影| 亚洲图片欧美午夜| 毛片精品免费在线观看| 亚洲中国色老太| 在线播放精品一区二区三区| 亚洲一区二区在线播放| 国产高清视频一区三区| 国产99久久精品一区二区 夜夜躁日日躁| 国产欧美日韩丝袜精品一区| 欧美精品国产精品日韩精品| 亚洲第一在线视频| 亚洲精品少妇网址| 在线视频免费一区二区| 欧美性视频精品| 国产亚洲欧美日韩美女| 亚洲一区二区三区四区在线播放| 色天天综合狠狠色| 亚洲风情亚aⅴ在线发布| 久久久之久亚州精品露出| 国产成人精品久久二区二区91| 91日韩在线视频| 国产精品扒开腿做| 亚洲精品在线91| 日韩有码视频在线| 国产在线观看不卡| 中文字幕精品久久久久| 日韩美女激情视频| 日韩欧美国产中文字幕| 日韩久久免费视频| 国产一区二区三区高清在线观看| 51精品在线观看| 一色桃子一区二区| 在线观看亚洲区| 日日狠狠久久偷偷四色综合免费| 亚洲天堂男人的天堂| 亚洲一区二区在线| 国产精品吴梦梦| 91精品视频在线看| 综合国产在线视频| 国产亚洲精品美女久久久久| 日本免费久久高清视频| 国产欧美精品久久久| 久久精品久久久久| 国产精品偷伦免费视频观看的| 日韩大陆毛片av| 欧美成人亚洲成人日韩成人| 亚洲最大福利网站| 国内精品久久久久伊人av| 亚洲精品久久在线| 8x海外华人永久免费日韩内陆视频| 欧美大胆在线视频| 俺去啦;欧美日韩| 欧美大片欧美激情性色a∨久久| 日韩av高清不卡| 97福利一区二区| 2020久久国产精品| 久久精品国产99国产精品澳门| 成人黄色在线观看| 欧美一区二区三区精品电影| 欧美第一黄色网| 色婷婷av一区二区三区在线观看| 欧美视频国产精品| 91亚洲人电影| 久久久久北条麻妃免费看| 4p变态网欧美系列|