【Java-Reflection】反射获取泛型参数类型

先上个栗子:

public class ListDemo {

	public static void main(String[] args) {

	}
	public List<String> stringList ;
	
	public List<String> getStringList(){
		return stringList;
	}
	public void setStringList(List<String> list){
		stringList = list;
	}

}

如果想获取List后面的泛型,使用getReturnType是不可行的

Method m = mainClass.getMethod("getStringList", null);
Class returnType1 = m.getReturnType();
System.out.println(returnType1.getName());

输出:java.util.List

只能获取是List,并不能进一步获取参数类型。

	//get return type
	Method getMethod = mainClass.getMethod("getStringList", null);
	Type returnType = getMethod.getGenericReturnType();
	if(returnType instanceof ParameterizedType){
		ParameterizedType type = (ParameterizedType) returnType;
		Type[] typeArguments = type.getActualTypeArguments();
		for(Type typeArgument : typeArguments){
			Class typeArgClass = (Class) typeArgument;
			System.out.println("typeArgClass = " + typeArgClass.getName());
		}
	
	}
	
	//get params type
	Method setMethod = mainClass.getMethod("setStringList", new Class[]{List.class});
	Type[] paramTypes = setMethod.getGenericParameterTypes();
	for(Type paramType:paramTypes){
		if(paramType instanceof ParameterizedType){
			ParameterizedType type = (ParameterizedType)paramType;
			Type[] typeArguments = type.getActualTypeArguments();
			for(Type typeArgument:typeArguments){
				Class typeArgClass = (Class)typeArgument;
				System.out.println("typeArgClass = " + typeArgClass.getName());
			}
		}
	}
	
	//get field type
	Field field = mainClass.getField("stringList");
	Type genericFieldType = field.getGenericType();
	if(genericFieldType instanceof ParameterizedType){
	    ParameterizedType aType = (ParameterizedType) genericFieldType;
	    Type[] fieldArgTypes = aType.getActualTypeArguments();
	    for(Type fieldArgType : fieldArgTypes){
	        Class fieldArgClass = (Class) fieldArgType;
	        System.out.println("fieldArgClass = " + fieldArgClass.getName());
	    }
	}
总结:

getMethod() -> getGenericReturnType()/getGenericReturnTypes() -> instanceof ParameterizedType ->getActualTypeArguments()


但是有些情况是不能通过反射获取泛型的参数类型的。

如果你获得了java.lang.reflect.Method对象,那么你就可以获取到这个方法的泛型返回类型信息。如果方法是在一个被参数化类型之中(译者注:如T fun())那么你无法获取他的具体类型,但是如果方法返回一个泛型类(译者注:如List fun())那么你就可以获得这个泛型类的具体参数化类型。

详细见: http://ifeve.com/java-reflection-9-generics/#header





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值