Tyep是java编程语言中所有类型的公共高级接口,包括原始类型(class),参数化类型(ParameterizedType),数组类型(GenericArrayType),类型变量(TypeVariable)和基本类型(Class)。
Type | 描述 |
原始类型Class | 类,枚举,数组,注解等 |
参数化类型ParameterizedType | 常用的泛型Class>,list,set,Map等 |
数组类型GenericArrayType | 泛型的数组T[] |
类型变量TypeVariable | 如T a |
基本类型Class | 基本类型 |
参数化类型,比如Map
getActualTypeArguments():返回的是Type[],比如Map
getOwnerType():获取泛型的拥有者,例如: Map 就是 Map.Entry
getRawType():获取声明泛型的类或者接口,也就是泛型中<>前面的那个值
private Map.Entry> map; private void get(){ try { Field field = ReflectCall.class.getDeclaredField("map"); ParameterizedType type = (ParameterizedType)field.getGenericType(); System.out.println(type.getActualTypeArguments().length);//2 System.out.println(type.getActualTypeArguments()[0].getTypeName());//java.lang.String System.out.println(type.getActualTypeArguments()[1].getTypeName());//java.util.List System.out.println(type.getRawType());//interface java.util.Map$Entry System.out.println(type.getOwnerType().getTypeName());//java.util.Map } catch (NoSuchFieldException e) { e.printStackTrace(); } }
泛型数组类型,描述PatameterizedType、TypeVariable类型的数组,比如List
只有一个方法getGenerocComponentType():返回泛型数组中元素的Type类型,即 List
private List[][] lists; private void get(){ try { Field field = ReflectCall.class.getDeclaredField("lists"); GenericArrayType type =(GenericArrayType)field.getGenericType(); System.out.println(type.getGenericComponentType().getTypeName());//java.util.List [] } catch (NoSuchFieldException e) { e.printStackTrace(); } }
泛型的变量,比如T,K,V等,有四个方法:
getBounds():获得该类型变量的上限(上边界),若无显式定义(extends),默认为 Object,返回时数组,因为可能有多个
getGenericDeclaration():获取声明该类型变量实体
getAnnotatedBounds():
返回一个AnnotatedType对象的数组,表示使用类型来表示此TypeVariable表示的类型参数的上限
getName():获取类型变量在源码中定义的名称
private Listlist; private void get(){ try { Field field = ReflectCall.class.getDeclaredField("list"); ParameterizedType type =(ParameterizedType)field.getGenericType(); TypeVariable variable = ( TypeVariable) type.getActualTypeArguments()[0]; System.out.println(variable.getBounds()[0].getTypeName());//java.lang.Number System.out.println(variable.getName());//T System.out.println(variable.getGenericDeclaration());//class ReflectCall System.out.println(variable.getAnnotatedBounds()[0].getType().getTypeName());//java.lang.Number } catch (NoSuchFieldException e) { e.printStackTrace(); } }
?—通配符表达式,表示通配符泛型,比如? extends Number;
getUpperBounds():获取泛型变量的上边界,extends
getLowerBounds():获取泛型变量的下边界(super)
private List extends Number > list; private void get(){ try { Field field = ReflectCall.class.getDeclaredField("list"); ParameterizedType type =(ParameterizedType)field.getGenericType(); WildcardType variable = ( WildcardType) type.getActualTypeArguments()[0]; System.out.println(variable.getUpperBounds()[0].getTypeName());//java.lang.Number } catch (NoSuchFieldException e) { e.printStackTrace(); } }