Java反射——Type接口詳解

Type的簡介

java.lang.reflect.Type接口及其相關接口用於描述java中用到的全部類型,是Java的反射中很重要的組成部分。java

在API文檔中,Type接口的說明以下:編程

Type 是 Java 編程語言中全部類型的公共高級接口。它們包括原始類型、參數化類型、數組類型、類型變量和基本類型。數組

從JDK1.5開始使用。編程語言

Type的得到

有不少場景下咱們能夠得到Type,好比:測試

  • Class. getGenericInterfaces()方法獲得Type[],也就是這個類實現接口的Type類型列表。.net

  • Class.getDeclaredFields()方法獲得Field[],也就是類的屬性列表,而後用Field. getGenericType()方法獲得這個屬性的Type類型。對象

  • Method. getGenericParameterTypes()方法得到Type[],也就是方法的參數類型列表。blog

Type的分類

Type接口包含了一個實現類(Class)和四個實現接口(TypeVariable, ParameterizedType, GenericArrayType, WildcardType),這四個接口都有本身的實現類,但這些實現類開發都不能直接使用,只能用接口。接口

在不一樣的場景下,java會使用上面五種實現類的其中一種,來解釋要描述的類型。開發

下面詳細解釋一下java是怎麼在這五種實現類中選擇的。

Class

當須要描述的類型是:

  1. 普通的java類(好比String,Integer,Method等等), 數組,
  2. 自定義類(好比咱們本身定義的TestReflect類),
  3. 8種java基本類型(好比int,float等)
  4. 可能還有其餘的類

那麼java會選擇Class來做爲這個Type的實現類,咱們甚至能夠直接把這個Type強行轉換類型爲Class。

這些類基本都有一個特色:基本和泛型無關,其餘4種Type的類型,基本都是泛型的各類形態。

ParameterizedType

當須要描述的類是泛型類時,好比List,Map等,不論代碼裏寫沒寫具體的泛型,java會選擇ParameterizedType接口作爲Type的實現。

真正的實現類是sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl。

ParameterizedType接口有getActualTypeArguments()方法,用於獲得泛型的Type類型數組。

GenericArrayType

當須要描述的類型是泛型類的數組時,好比好比List[],Map[],type會用GenericArrayType接口做爲Type的實現。

真正的實現類是sun.reflect.generics.reflectiveObjects. GenericArrayTypeImpl。

GenericArrayType接口有getGenericComponentType()方法,獲得數組的組件類型的Type對象。

WildcardType

當須要描述的類型是泛型類,並且泛型類中的泛型被定義爲(? 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關鍵字,則返回空數組。

TypeVariable

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

相關文章
相關標籤/搜索