【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


版权声明:本文为u013127687原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>