SpringFramework中的ResolvableType
1 示例程序
/** BaseService **/
public abstract class BaseService<T> {
}
/** PriorityOrder **/
public interface PriorityOrder<T>{}
/** CustomService**/
interface CustomService<T,K>{}
/** CustomServiceImpl**/
public class CustomServiceImpl<ArrayList> extends BaseService<List<String>>
implements CustomService<List<Map<String, Integer>>, BaseService<Set>>,PriorityOrder<Integer> {
private HashMap<Integer, List<String>> map;
}
public class RawGenericTypeTest {
public static void main(String[] args) {
TypeVariable<Class<CustomServiceImpl>>[] typeParameters = CustomServiceImpl.class.getTypeParameters();
//ArrayList
print(typeParameters);
Type genericSuperclass = CustomServiceImpl.class.getGenericSuperclass();
//com...BaseService<java.util.List<java.lang.String>>
print(genericSuperclass);
Type[] genericInterfaces = CustomServiceImpl.class.getGenericInterfaces();
//com...CustomService<
// java.util.List<java.util.Map<java.lang.String, java.lang.Integer>>
// , com...BaseService<java.util.Set>
// >
//com...PriorityOrder<java.lang.Integer>
print(genericInterfaces);
}
public static void print(Type ...types){
for (Type type : types) {
System.out.println(type);
}
}
}
Spring ResolvableType 实现
ResolvableType 的类定义如下,我们这里关心3个实例变量:
class ResolvableType{
private final Type type;
private ResolvableType[] interfaces;
private ResolvableType[] generics;
}
我们现在要获取 CustomServiceImpl
定义中父类的泛型
/** CustomServiceImpl**/
public class CustomServiceImpl<ArrayList> extends BaseService<List<String>>
implements CustomService<List<Map<String, Integer>>, BaseService<Set>>,PriorityOrder<Integer> {
private HashMap<Integer, List<String>> map;
}
ResolvableType resolvableType = ResolvableType.forClass(CustomServiceImpl.class);
ResolvableType superType = resolvableType.getSuperType();
System.out.println(superType);
//output: BaseService<java.util.List<java.lang.String>>
System.out.println(superType.getGeneric(0));
//output: java.util.List<java.lang.String>
System.out.println(superType.getGeneric(0,0));
//output: java.lang.String
/** BaseService<List<String>> **/
// BaseService 被封装成了ResolvableType
// ResolvableType
// |-type:BaseService
// |-ResolvableType[] generics
// |-ResolvableType [0]
// |-type:List
// |-ResolvableType[]generics
// 3|-ResolvableType [0][0]
// |-type:String
// |-null
我们现在要获取 CustomServiceImpl
定义中实现接口的泛型
/** CustomServiceImpl**/
public class CustomServiceImpl<ArrayList> extends BaseService<List<String>>
implements CustomService<List<Map<String, Integer>>, BaseService<Set>>,PriorityOrder<Integer> {
private HashMap<Integer, List<String>> map;
}
ResolvableType[] interfaces = ResolvableType.forClass(CustomServiceImpl.class).getInterfaces();
//获取CustomService接口的ResolvableType
ResolvableType customServiceType = interfaces[0];
//获取CustomService接口的第一个泛型参数List的ResolvableType
System.out.println(customServiceType.getGeneric(0));
//获取PriorityOrder接口的ResolvableType
ResolvableType priorityOrderType = interfaces[1]