驽马十驾 驽马十驾

驽马十驾,功在不舍

目录
利用Spring的API获取泛型实际类型
/    

利用Spring的API获取泛型实际类型

泛型实际类型获取

泛型的实际类型获取在写底层基础类的时候,经常会用到,这里我将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());  
积土成山,风雨兴焉。积水成渊,蛟龙生焉。