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

相关文章
相关标签/搜索