这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党
我们是否经常在写一些工具类或者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
类。下面我们一起来学习下吧
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()); } }
@Test public void getPropertyListsGeneric() { ResolvableType resolvableType = ResolvableType.forField(ReflectionUtils.findField(GenericClass.class, "listString")); for (ResolvableType generic : resolvableType.getGenerics()) { System.out.println(generic.resolve()); } }
@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); }
@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()); }