先上个栗子:
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