-
背景
-
ResolvableType 的使用
-
获取父类的泛型
-
获取接口上的泛型
-
获取属性上的泛型
-
获取方法返回值的泛型
-
获取构造方法参数的泛型
-
参考
背景
我们是否经常在写一些工具类或者SDK的时候需要获取类上面的泛型 比如父类的泛型,这样的
static class Person<T, V> {
}
static class Student extends Person<String, Integer> {
}
比如接口上的泛型
interface StudentServiceImpl<T, V> {
}
static class StudentService implements StudentServiceImpl<String, Student> {
}
等等一系列需要获取泛型的操作,但是Java的原生SDK还是比较难用和冗余的,所以Spring在此背景下又扩展了Java 反射对泛型的操作,及ResolvableType
类。下面我们一起来学习下吧
ResolvableType 的使用
获取父类的泛型
static class Person<T, V> {}
static class Student extends Person<String, Integer> {}
-
获取方式
@Test
public void getPersonGenericBySpring() {
ResolvableType resolvableType = ResolvableType.forClass(Student.class);
for (ResolvableType generic : resolvableType.getSuperType().getGenerics()) {
System.out.println(generic.resolve());
}
}
-
运行结果

获取接口上的泛型
interface StudentServiceImpl<T, V> { }
static class StudentService implements StudentServiceImpl<String, Student> { }
-
获取方式
@Test
public void getInterfaceBySpring() {
ResolvableType resolvableType = ResolvableType.forClass(StudentService.class);
for (ResolvableType anInterface : resolvableType.getInterfaces()) {
for (ResolvableType generic : anInterface.getGenerics()) {
System.out.println(generic.resolve());
}
}
}
-
运行结果

获取属性上的泛型
测试类
@Data
static class GenericClass {
private List<String> listString;
private List<List<String>> listLists;
private Map<String, Long> maps;
private Person<String, Integer> person;
private HashMap<String, List<String>> method() {
return null;
}
public GenericClass(List<List<String>> list, Map<String, Map<String, Integer>> map) {
}
}
获取属性对象的泛型
-
获取方式
@Test
public void getPropertyGeneric() {
ResolvableType resolvableType = ResolvableType.forField(ReflectionUtils.findField(GenericClass.class, "person"));
for (ResolvableType generic : resolvableType.getGenerics()) {
System.out.println(generic.resolve());
}
}
获取属性List上的泛型
-
获取方式
@Test
public void getPropertyListsGeneric() {
ResolvableType resolvableType = ResolvableType.forField(ReflectionUtils.findField(GenericClass.class, "listString"));
for (ResolvableType generic : resolvableType.getGenerics()) {
System.out.println(generic.resolve());
}
}
获取属性List嵌套List的泛型
-
获取方式
@Test
public void getPropertyListAndListGeneric() {
ResolvableType resolvableType = ResolvableType.forField(ReflectionUtils.findField(GenericClass.class, "listLists"));
ResolvableType generic1 = resolvableType.getGeneric(0);
// 第一层
System.out.println("第一层泛型: " + generic1.resolve());
// 第二层
ResolvableType generic = generic1.getGeneric(0);
System.out.println("第二层泛型: " + generic.resolve());
Class<?> resolve = resolvableType.getGeneric(0, 0).resolve();
// 也可以使用如下方式获取
System.out.println("第二层泛型: " + resolve);
}
获取属性Map上的泛型
-
获取方式
@Test
public void getPropertyMapGeneric() {
ResolvableType resolvableType = ResolvableType
.forField(ReflectionUtils.findField(GenericClass.class, "maps"));
for (ResolvableType generic : resolvableType.getGenerics()) {
System.out.println(generic.resolve());
}
}
获取方法返回值的泛型
-
获取方式
@Test
public void getMethodGeneric() {
ResolvableType resolvableType =
ResolvableType.forMethodReturnType(ReflectionUtils.findMethod(GenericClass.class, "method"));
// 第一层
for (ResolvableType generic : resolvableType.getGenerics()) {
System.out.println("Map中的泛型: " + generic.resolve());
}
// 获取第二层的
System.out.println("Map中List的泛型: " + resolvableType.getGeneric(1, 0).resolve());
}
获取构造方法参数的泛型
-
获取方式
@Test
public void getConstructorGeneric() {
ResolvableType resolvableType =
ResolvableType.forConstructorParameter(ClassUtils.getConstructorIfAvailable(GenericClass.class, List.class, Map.class), 1);
for (ResolvableType generic : resolvableType.getGenerics()) {
System.out.println("构造方法参数泛型: " + generic.resolve());
}
System.out.println("Map中的泛型: " + resolvableType.getGeneric(1, 0).resolve());
}
参考
博客
原文始发于微信公众号(小奏技术):Spring ResolvableType满足你对Java泛型的任何操作和幻想
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/29938.html