泛型的实际类型获取在写底层基础类的时候,经常会用到,这里我将Spring4
中关于泛型获取的API
归纳整理如下
请注意我的措辞,如果是一个很抽象没有加任何限定的泛型,那么是获取不到的。
当然如果是实现了接口或者继承了某个类,那么是可以获取到具体的泛型类型的。
/**
* 泛型类
*/
public class CustomServiceImpl extends BaseService<List<String>>
implements CustomService<List<Map<String, Integer>>, BaseService>
{
//......
}
@Test
public void testGeneric() {
//获取到 CustomServiceImpl 这个类的Type
ResolvableType 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表示获取的String
ResolvableType generic1_0 = generic1.getGeneric(0, 0);
ResolvableType generic1_1 = generic1.getGeneric(0, 1); //Integer
//获取到实际的Class
Class<?> 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());