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