这里是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> {}
@Testpublic void getPersonGenericBySpring() {ResolvableType resolvableType = ResolvableType.forClass(Student.class);for (ResolvableType generic : SuperType().getGenerics()) {System.out.solve());}}
interface StudentServiceImpl<T, V> { }static class StudentService implements StudentServiceImpl<String, Student> { }
@Testpublic void getInterfaceBySpring() {ResolvableType resolvableType = ResolvableType.forClass(StudentService.class);for (ResolvableType anInterface : Interfaces()) {for (ResolvableType generic : Generics()) {System.out.solve());}}}
测试类
@Datastatic 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) {}}
@Testpublic void getPropertyGeneric() {ResolvableType resolvableType = ResolvableType.forField(ReflectionUtils.findField(GenericClass.class, "person"));for (ResolvableType generic : Generics()) {System.out.solve());}}
@Testpublic void getPropertyListsGeneric() {ResolvableType resolvableType = ResolvableType.forField(ReflectionUtils.findField(GenericClass.class, "listString"));for (ResolvableType generic : Generics()) {System.out.solve());}}
@Testpublic void getPropertyListAndListGeneric() {ResolvableType resolvableType = ResolvableType.forField(ReflectionUtils.findField(GenericClass.class, "listLists"));ResolvableType generic1 = Generic(0);// 第一层System.out.println("第一层泛型: " + solve());// 第二层ResolvableType generic = Generic(0);System.out.println("第二层泛型: " + solve());Class<?> resolve = Generic(0, 0).resolve();// 也可以使用如下方式获取System.out.println("第二层泛型: " + resolve);}
@Testpublic void getPropertyMapGeneric() {ResolvableType resolvableType = ResolvableType.forField(ReflectionUtils.findField(GenericClass.class, "maps"));for (ResolvableType generic : Generics()) {System.out.solve());}}
@Testpublic void getMethodGeneric() {ResolvableType resolvableType =ResolvableType.forMethodReturnType(ReflectionUtils.findMethod(GenericClass.class, "method"));// 第一层for (ResolvableType generic : Generics()) {System.out.println("Map中的泛型: " + solve());}// 获取第二层的System.out.println("Map中List的泛型: " + Generic(1, 0).resolve());}
@Testpublic void getConstructorGeneric() {ResolvableType resolvableType =ResolvableType.ConstructorIfAvailable(GenericClass.class, List.class, Map.class), 1);for (ResolvableType generic : Generics()) {System.out.println("构造方法参数泛型: " + solve());}System.out.println("Map中的泛型: " + Generic(1, 0).resolve());}
博客
本文发布于:2024-01-28 04:04:41,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063858974643.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |