如果你拿到了一个方法的返回值的类型,或者是一个字段的类型,但是它是一个泛形。
其实通过java的反射机制,是可以很简单的拿到方法的类型的
Method method = ..... Class<?> returnType = method.getReturnType(); String name = returnType.getName();
但是这样只能拿到方法返回值本身的类型,如何拿到泛形呢?
Method method = ....; Type genericReturnType = method.getGenericReturnType(); System.out.println(genericReturnType); if(genericReturnType instanceof ParameterizedType){ //通过这一步,判断是否是泛形参数的类型 ParameterizedType tt = (ParameterizedType) genericReturnType; //这个就是泛型参数,如果没有带泛形,打印出来的就是 返回值本身 Type[] actualTypeArguments = tt.getActualTypeArguments(); //为什么会是一个数组呢?原因是Map<String,Object>是有两个,List<String>只有一个, for(Type t : actualTypeArguments){
if(t instanceof ParameterizedType){
...任何一个Type都有可能是泛形,如果是泛形,则需要重新走上面的getActualTypeArguments()
}
if(t instanceof Class){
//拿到真实的Class了
System.out.println(t);
}
}
}