java.lang.reflect.Type接口及其相關接口用於描述java中用到的全部類型,是Java的反射中很重要的組成部分。java
在API文檔中,Type接口的說明以下:編程
Type 是 Java 編程語言中全部類型的公共高級接口。它們包括原始類型、參數化類型、數組類型、類型變量和基本類型。數組
從JDK1.5開始使用。編程語言
有不少場景下咱們能夠得到Type,好比:測試
Class. getGenericInterfaces()方法獲得Type[],也就是這個類實現接口的Type類型列表。.net
Class.getDeclaredFields()方法獲得Field[],也就是類的屬性列表,而後用Field. getGenericType()方法獲得這個屬性的Type類型。對象
Method. getGenericParameterTypes()方法得到Type[],也就是方法的參數類型列表。blog
Type接口包含了一個實現類(Class)和四個實現接口(TypeVariable, ParameterizedType, GenericArrayType, WildcardType),這四個接口都有本身的實現類,但這些實現類開發都不能直接使用,只能用接口。接口
在不一樣的場景下,java會使用上面五種實現類的其中一種,來解釋要描述的類型。開發
下面詳細解釋一下java是怎麼在這五種實現類中選擇的。
當須要描述的類型是:
那麼java會選擇Class來做爲這個Type的實現類,咱們甚至能夠直接把這個Type強行轉換類型爲Class。
這些類基本都有一個特色:基本和泛型無關,其餘4種Type的類型,基本都是泛型的各類形態。
當須要描述的類是泛型類時,好比List,Map等,不論代碼裏寫沒寫具體的泛型,java會選擇ParameterizedType接口作爲Type的實現。
真正的實現類是sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl。
ParameterizedType接口有getActualTypeArguments()方法,用於獲得泛型的Type類型數組。
當須要描述的類型是泛型類的數組時,好比好比List[],Map[],type會用GenericArrayType接口做爲Type的實現。
真正的實現類是sun.reflect.generics.reflectiveObjects. GenericArrayTypeImpl。
GenericArrayType接口有getGenericComponentType()方法,獲得數組的組件類型的Type對象。
當須要描述的類型是泛型類,並且泛型類中的泛型被定義爲(? extends xxx)或者(? super xxx)這種類型,好比List<? extends TestReflect>,這個類型首先將由ParameterizedType實現,當調用ParameterizedType的getActualTypeArguments()方法後獲得的Type就由WildcardType實現。
真正的實現類是sun.reflect.generics.reflectiveObjects. WildcardTypeImpl。
WildcardType接口有getUpperBounds()方法,獲得的是類型的上邊界的Type數組,實際上就是類型的直接父類,也就是extends後面的類型。顯然在當前java的設定中,這個數組只可能有一個元素,由於java如今只能extends一個類。若是實在沒寫extends,那他的直接父類就是Object。
WildcardType接口有getLowerBounds()方法,獲得的是類型的下邊界的Type數組,有super關鍵字時可能會用到,經測試不會獲得類型的子類,而是隻獲得super關鍵字後面的類型,若是沒寫super關鍵字,則返回空數組。
Type的最後一種實現形式是TypeVariable接口,這種實現形式是在泛型類中使用的。
好比咱們定義一個泛型類TestReflect<T>,並在類中定義方法oneMethod(T para),那麼當調用method.getGenericParameterTypes()方法獲得的Type數組,數組的元素就是由TypeVariable接口實現的。
真正的實現類是sun.reflect.generics.reflectiveObjects. TypeVariableImpl。
以上就是關於Type接口的詳細介紹。 ———————————————— 版權聲明:本文爲CSDN博主「lkforce」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。 原文連接:https://blog.csdn.net/lkforce/article/details/82466893