statement:本篇内容只是建立在我目前经验的基础之上,必然有不完善甚至是不正确的地方,请谨慎阅读,如果能指出错误与不足之处,更是不甚感激
一、接口Type
接口Type
(注意是java.lang.reflect中的),代表了Java中泛型类型超接口,实现它的共有四个接口和一个类,即接口:ParameterizedType、GenericArrayType、WildcardType、TypeVariable<D>,还有类:Class
-
ParameterizedType
代表的是像List<String> x
、Person<Integer> x
(Person
是一个虚构的带泛型的类)这样的,x的类型就会是ParameterizedType
-
GenericArrayType
代表的是像List<String>[] x
、Person<Integer>[] x
这样的由ParameterizedType
类型组合起来的类型,这时x的类型会是GenericArrayType
-
TypeVariable
代表是泛型变量,比如T x
或者List<T> x
,前者x的类型为TypeVariable
,后者x本身是ParameterizedType
,但是其泛型参数列表的第一个(共一个)参数的类型是TypeVariable
,不同于List<String>
,由于String是确定的类,所以其泛型参数列表第一个参数类型是Class
-
WildcardType
与TypeVariable
相似,只是其代表的是一种更广范围的泛型变量,比如? extends T
、? extends Person
等等,如List<? extends Person>
其泛型参数列表的第一个参数类型即为WildcardType
而不是TypeVariable
二、一段实验代码与结果
代码:
public class Test<T> {
private String str;
private int age;
private String[] strArr;
private List<T> tList;
private List<T>[] tListArr;
private List<Type> typeList;
private List<? extends Type> unKnowTypeList;
private List<? extends T> unKnowTList;
private T t;
public static void main(String... args){
Test test = new Test();
Arrays.stream(Test.class.getDeclaredFields()).forEach(item -> {
Type type = item.getGenericType();
System.out.println(item.getName() + "--------->" +type.getClass());
if(type instanceof ParameterizedType){
ParameterizedType pt = (ParameterizedType)type;
if (pt.getOwnerType() != null) {
System.out.println(pt.getOwnerType().getTypeName());
}
System.out.println(item.getName() + "----rawType----->" +pt.getRawType().getTypeName());
Arrays.stream(pt.getActualTypeArguments()).forEach(ar -> {
System.out.println(item.getName() + "----argType," + ar.getTypeName() + "----->" +ar.getClass() );
});
}else if(type instanceof GenericArrayType){
GenericArrayType pt = (GenericArrayType)type;
System.out.println(item.getName() + "----componentType,"+pt.getGenericComponentType().getTypeName() + "----->" +pt.getGenericComponentType().getClass());
}
});
}
}
结果:
str--------->class java.lang.Class
age--------->class java.lang.Class
strArr--------->class java.lang.Class
tList--------->class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
tList----rawType----->java.util.List
tList----argType,T----->class sun.reflect.generics.reflectiveObjects.TypeVariableImpl
tListArr--------->class sun.reflect.generics.reflectiveObjects.GenericArrayTypeImpl
tListArr----componentType,java.util.List<T>----->class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
typeList--------->class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
typeList----rawType----->java.util.List
typeList----argType,java.lang.reflect.Type----->class java.lang.Class
unKnowTypeList--------->class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
unKnowTypeList----rawType----->java.util.List
unKnowTypeList----argType,? extends java.lang.reflect.Type----->class sun.reflect.generics.reflectiveObjects.WildcardTypeImpl
unKnowTList--------->class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
unKnowTList----rawType----->java.util.List
unKnowTList----argType,? extends T----->class sun.reflect.generics.reflectiveObjects.WildcardTypeImpl
t--------->class sun.reflect.generics.reflectiveObjects.TypeVariableImpl
参考文档:
[1] java Type 详解