Type 是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量(即泛型变量)和基本类型。
1、ParameterizedType:参数化类型 比如:List<String>
2、WildcardType 表示一个通配符类型表达式,比如 ?、? extends Number 或 ? super Integer。
3、GenericArrayType 表示一种数组类型,其组件类型为参数化类型或类型变量。 比如:泛型数组
比如 public void test(T[] param)
4、TypeVariable 比如直接的泛型变量T t;
public static <T> void fun(T[] param,String str,T t){
}
5、Class:类,比如String,int,Integer,Object
看下面这个例子
WildcardType:? extends Number
GenericArrayType:T[] param
Class<?> : String str 普通对象
TypeVariable: V v
1、ParameterizedType:参数化类型 比如:List<String>
2、WildcardType 表示一个通配符类型表达式,比如 ?、? extends Number 或 ? super Integer。
3、GenericArrayType 表示一种数组类型,其组件类型为参数化类型或类型变量。 比如:泛型数组
比如 public void test(T[] param)
4、TypeVariable 比如直接的泛型变量T t;
public static <T> void fun(T[] param,String str,T t){
}
5、Class:类,比如String,int,Integer,Object
看下面这个例子
public static <T> void fun(List<? extends Number> list,T[] param,String str,V v){
}
ParameterizedType:List<? extends Number> list
WildcardType:? extends Number
GenericArrayType:T[] param
Class<?> : String str 普通对象
TypeVariable: V v
下面看看我们如何通过反射来获取:
package reflect;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.GenericDeclaration;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;
import java.util.Arrays;
import java.util.List;
/**
@author zhangquanit
*/
public class TypeTest {
public static <T,V> void fun(List<? extends Number> list,T[] param,String str,V v){
}
public static void main(String[] args)throws Exception {
Method method = TypeTest.class.getMethod("fun", List.class,Object[].class,String.class,Object.class);
//泛型声明变量
TypeVariable<Method>[] typeParameters = method.getTypeParameters();//T,V
//参数type
Type[] genericParameterTypes = method.getGenericParameterTypes();
for(Type type:genericParameterTypes){
System.out.println("#######################"+type.getTypeName()+"##########");
if(type instanceof ParameterizedType){
ParameterizedType parameterizedType=(ParameterizedType) type;
Type rawType = parameterizedType.getRawType();
Type ownerType=parameterizedType.getOwnerType();
System.out.println("---parameterizedType类型");
System.out.println("rawType="+rawType);
System.out.println("ownerType="+ownerType);
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
for(Type actualType:actualTypeArguments){
if(actualType instanceof WildcardType){
WildcardType wildcardType=(WildcardType) actualType;
Type upperType=null;
Type lowerType=null;
Type[] upperBounds = wildcardType.getUpperBounds();
if(upperBounds.length>0)upperType=upperBounds[0];
Type[] lowerBounds = wildcardType.getLowerBounds();
if(lowerBounds.length>0)lowerType=lowerBounds[0];
System.out.println(actualType.getTypeName()+"的下限为 "+lowerType);
System.out.println(actualType.getTypeName()+"的上限为 "+upperType);
}else if(actualType instanceof Class){
System.out.println(actualType.getTypeName()+"实际参数为Class类型");
}
}
}else if(type instanceof TypeVariable){
TypeVariable typeVariable=(TypeVariable) type;
System.out.println("---TypeVariable类型");
Type[] bounds = typeVariable.getBounds();
String name = typeVariable.getName();
GenericDeclaration genericDeclaration = typeVariable.getGenericDeclaration();
System.out.println("bounds="+Arrays.toString(bounds));
System.out.println("name="+name);
System.out.println("genericDeclaration="+genericDeclaration);
}else if(type instanceof GenericArrayType){
GenericArrayType genericArrayType=(GenericArrayType) type;
System.out.println("---GenericArrayType类型");
Type componentType = genericArrayType.getGenericComponentType();
System.out.println("数组元素类型为:"+componentType);
}else if(type instanceof Class){
System.out.println("---Class类型");
}
System.out.println();
}
}
}
打印结果如下
#######################java.util.List<? extends java.lang.Number>##########
---parameterizedType类型
rawType=interface java.util.List
ownerType=null
? extends java.lang.Number的下限为 null
? extends java.lang.Number的上限为 class java.lang.Number
#######################T[]##########
---GenericArrayType类型
数组元素类型为:T
#######################java.lang.String##########
---Class类型
#######################V##########
---TypeVariable类型
bounds=[class java.lang.Object]
name=V
genericDeclaration=public static void reflect.TypeTest.fun(java.util.List,java.lang.Object[],java.lang.String,java.lang.Object)