Type

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 

看下面这个例子
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)

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值