泛型实际类型获取
泛型的实际类型获取在写底层基础类的时候,经常会用到,这里我将Spring4中关于泛型获取的API归纳整理如下
类上有约束的泛型
请注意我的措辞,如果是一个很抽象没有加任何限定的泛型,那么是获取不到的。
当然如果是实现了接口或者继承了某个类,那么是可以获取到具体的泛型类型的。
/*** 泛型类*/public class CustomServiceImpl extends BaseService<List<String>>implements CustomService<List<Map<String, Integer>>, BaseService>{//......}@Testpublic void testGeneric() {//获取到 CustomServiceImpl 这个类的TypeResolvableType oriType = ResolvableType.forClass(CustomServiceImpl.class);//获取CustomServiceImpl这个类要实现的接口,因为接口可能会有多个,所以是一个数组ResolvableType[] interfaces = oriType.getInterfaces();//获取父类,就是extends的那个类,因为java是单继承,所以只会有一个ResolvableType superType = oriType.getSuperType();//开始进行泛型获取,通过最复杂的:CustomService<List<Map<String, Integer>>, BaseService> 举例ResolvableType generic1 = interfaces[0].getGeneric(0); //List<Map<String, Integer>>ResolvableType generic2 = interfaces[0].getGeneric(1); //BaseService//第一个0表示获取的是:Map<String, Integer> ,第二个0表示获取的StringResolvableType generic1_0 = generic1.getGeneric(0, 0);ResolvableType generic1_1 = generic1.getGeneric(0, 1); //Integer//获取到实际的ClassClass<?> resolve = generic1_1.resolve();System.out.println(resolve);}
获取字段的泛型
public class GenricInjectTest {private Map<String, Map<String, Integer>> map;// ....}
如果要获取某个字段的泛型,那么可以采用:
ResolvableType resolvableType4 = ResolvableType.forField(ReflectionUtils.findField(GenricInjectTest.class, "map"));resolvableType4.getGeneric(1).getGeneric(1).resolve();//结果是Integer
获取返回值的泛型参数
ResolvableType resolvableType5 = ResolvableType.forMethodReturnType(ReflectionUtils.findMethod(GenricInjectTest.class, "methodName"));System.out.println(resolvableType5.getGeneric(1, 0).resolve());
