乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      java基礎(chǔ)之反射類型Type

       冒險(xiǎn)的K 2021-09-11

      java基礎(chǔ)之反射類型Type

      Java在加入泛型之后,僅僅Class已經(jīng)不足以描述數(shù)據(jù)的類型了,比如List類型的數(shù)據(jù),其Class的類型為L(zhǎng)ist.class,但是其類型包含了泛型參數(shù),所以java引入了Type類型來(lái)描述泛型類型。除了泛型類型,還有數(shù)組格式的數(shù)據(jù),其類型也包含兩部分,一部分是數(shù)組對(duì)象本身的class,另外一部分是數(shù)組中數(shù)據(jù)的類型。本文會(huì)詳細(xì)介紹JavaType中的各種類型,分析這些類型的使用方法。

      Type介紹

      Type是Java 編程語(yǔ)言中所有類型的公共高級(jí)接口,也就是Java中所有"類型"的接口。官方原話定義如下
      官方文檔:Type is the common superinterface for all types in the Java programming language. These include raw types, parameterized types, array types, type variables and primitive types.

      這樣的官方描述有點(diǎn)難懂,此處我畫(huà)個(gè)圖解釋一下。Type其實(shí)是和泛型一起出現(xiàn)的,可以說(shuō)Type就是為了支持泛型。

      • 泛型出現(xiàn)之前,我們可以通過(guò)Class來(lái)確認(rèn)一個(gè)對(duì)象的類型,比如ClassA A,那么A的類型就是ClassA;

      • 泛型出現(xiàn)之后,顯然不能通過(guò)Class唯一確認(rèn)一個(gè)對(duì)象的類型,比如List A,A的Class是List,但是A的類型顯然不僅僅是List,它是由Class類型的List + TypeVariables的ClassA聯(lián)合確認(rèn)的一個(gè)Type。

      Java的反射類型

      > A type variable is an unqualified identifier used as a type in class, interface, method, and constructor bodies.

      Type的類型

      Type可以分為兩大類:包含TypeVariables和不包含TypeVariables的類型:

      • 不包含TypeVariable:包含基本數(shù)據(jù)類型(int, long等),基本Class(如Object,不包含泛型的類);

      • 包含TypeVariable,按照包含的TypeVariable又分為以下幾類:

        • ParameterizedType: 表示一種參數(shù)化的類型,如List,泛型的參數(shù)已經(jīng)指定;

        • GenericArrayType: 表示一種元素類型是參數(shù)化類型或者類型變量的數(shù)組類型,如List[][];

        • WildcardType: 代表一種通配符類型表達(dá)式,比如List<?>, List<? extends ClassA>, List<? super Object>。

      反射的類型中的變量

      繼續(xù)介紹Type之前,需要先介紹一下java的泛型機(jī)制:

      泛型是Java SE 1.5的新特性,泛型的本質(zhì)是參數(shù)化類型,也就是說(shuō)所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù)。這種參數(shù)類型可以用在類、接口和方法的創(chuàng)建中,分別稱為泛型類、泛型接口、泛型方法。 Java語(yǔ)言引入泛型的好處是安全簡(jiǎn)單。泛型的好處是在編譯的時(shí)候檢查類型安全,并且所有的強(qiáng)制轉(zhuǎn)換都是自動(dòng)和隱式的,以提高代碼的重用率。

      泛型信息只存在于代碼編譯階段,在進(jìn)入 JVM 之前,與泛型相關(guān)的信息會(huì)被擦除掉,專業(yè)術(shù)語(yǔ)叫做類型擦除。

      參數(shù)化類型ParameterizedType

      參數(shù)化類型的寫(xiě)法如下:C,其中C是Class類型, 是Type,先列幾個(gè)參數(shù)化類型的合法定義:

      Seq\<string\> seq\<seq\<string\>\>="" seq\<string\>.zipper\<integer\>="" pair\<string,integer\>=""

      ParameterizedType類型的接口方法介紹:

      返回值方法名稱描述信息
      Type[]getActualTypeArguments()參數(shù)化類型中的TypeVariable參數(shù)類型,如List 返回 String.class, List<list<> 返回List<
      TypegetOwnerType()獲取當(dāng)前Type所屬的Type,比如對(duì)于O.I中的I類型,會(huì)返回 O
      TypegetRawType()獲取當(dāng)前Type的Class,如List 返回 List.class

      泛型類型Parameterized

      >ParameterizedType represents a parameterized type such as Collection.A parameterized type is created the first time it is needed by a reflective method, as specified in this package. When a parameterized type p is created, the generic type declaration that p instantiates is resolved, and all type arguments of p are created recursively. See TypeVariable for details on the creation process for type variables. Repeated creation of a parameterized type has no effect. Instances of classes that implement this interface must implement an equals() method that equates any two instances that share the same generic type declaration and have equal type parameters.

      數(shù)組類型GenericArrayType

      數(shù)組泛型類型的寫(xiě)法如下:C[],其中C是Class類型, 是Type,先列幾個(gè)數(shù)組泛型類型的合法定義:

      List\<string\>[] list\<seq\<string\>\>="" [][]=""
      返回值方法名稱描述信息
      TypegetGenericComponentType()數(shù)組元素的類型,如List []返回List

      數(shù)組類型

      注意:<>不能出現(xiàn)在數(shù)組的初始化中,即new數(shù)組之后不能出現(xiàn)<>,否則javac無(wú)法通過(guò)。但是作為引用變量或者方法的某個(gè)參數(shù)是完全可以的。不包含泛型的數(shù)組本節(jié)不做介紹(如String[]),下文中會(huì)進(jìn)行介紹。
      >GenericArrayType represents an array type whose component type is either a parameterized type or a type variable.

      通配符類型WildcardType

      通配符類型何其字面意思相同,其泛型類型不再是一個(gè)具體的類,而是一個(gè)通配符表達(dá)式,表達(dá)式包含以下三種:"?","? extends Type", "? super Type",其中Type可以為WildcardType,GenericArrayType,ParameterizedType,Class.
      >WildcardType represents a wildcard type expression, such as ?, ? extends Number, or ? super Integer.

      WildcardType 接口的方法和介紹如下.

      返回值方法名稱描述信息
      Type[]getLowerBounds()返回通配Type的下限類型,現(xiàn)階段返回值的長(zhǎng)度為1
      Type[]getUpperBounds()返回通配Type的上限類型,現(xiàn)階段返回值的長(zhǎng)度為1

      通配符類型WildcardType

      基本Class、基本數(shù)據(jù)類型和數(shù)組

      通過(guò)反射獲取基本的Class和基本數(shù)據(jù)類型此處就不詳細(xì)介紹了,接下來(lái)會(huì)重點(diǎn)介紹一下數(shù)組類型。java的數(shù)組類型由虛擬機(jī)生成,虛擬機(jī)生成的數(shù)組類型的名稱一般類似于"class [[Ljava.lang.String;",注意其中的"[["表示是二維數(shù)組。那么如何獲取數(shù)組中的元素類型呢? java.lang.Class包中提供了以下接口查詢:

      返回值方法名稱描述信息
      Class<?>componentType()如果類型是數(shù)組類型,返回?cái)?shù)組中元素的類型,否則返回null

      >componentType():Returns the component type of this Class, if it describes an array type, or null otherwise.

      數(shù)組

      如何獲取字段或參數(shù)的Type信息

      平時(shí)使用java程序的過(guò)程中,我們接觸到的最多的類型只有Class,像泛型類型和數(shù)組類型,通常只有通過(guò)反射才能獲取到。

      獲取字段的泛型信息

      如下程序中,我們首先定義了一個(gè)自定義的類TestParameterizedType,只包含一個(gè)字段List field,然后我們?cè)诹硗庖粋€(gè)單測(cè)實(shí)例中嘗試通過(guò)反射獲取field的相關(guān)信息。通過(guò)field.getType()我們獲取到了field的類型。通過(guò)field.getGenericType()我們獲取到了field的泛型信息。

      public class ReflectParameterizedTypeTest {
      
          public static class TestParameterizedType {
              private List\<string\> field;="" }="" @test="" public="" void="" testinttype()="" throws="" nosuchfieldexception="" {="" class\<?\>="" clazz="TestParameterizedType.class;" field="" 此處獲取到字段的實(shí)際class類型="" clazztype="field.getType();" system.out.println("field="" type:=""  +="" clazztype.getname());="" 此處獲取到字段的泛型類型="" type="" generictype="field.getGenericType();" generic="" field.getgenerictype().gettypename());=""

      idea泛型示例

      獲取方法參數(shù)的泛型信息

      類似于字段的獲取方式,方法可以通過(guò)Method.getGenericParameterTypes()獲取所有參數(shù)的泛型信息。

      獲取運(yùn)行時(shí)變量的泛型信息

      不可能,具體原因參考java的泛型擦除原理。

      本文大多數(shù)內(nèi)容參考了java官方文檔,點(diǎn)此直達(dá)JAVA15官方文檔地址

      www.
      www.

      www.

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多