Spring的API获取泛型实际类型

文章目录

  • 学习链接
  • Spring中获取泛型类型
    • 类上有约束的泛型
      • BaseService\<T> (带泛型父类)
      • CustomService\<T, K,U> (带泛型接口)
      • CustomServiceImpl (指定泛型具体类型)
      • GenericTest 获取类上的泛型示例
    • 获取字段的泛型
    • 获取返回值的泛型参数

学习链接

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

Spring中获取泛型类型

Spring中获取泛型类型

泛型的实际类型获取在写底层基础类的时候,经常会用到,这里将Spring4中关于泛型获取的API归纳整理如下

类上有约束的泛型

BaseService<T> (带泛型父类)

public class BaseService<T> {}

CustomService<T, K,U> (带泛型接口)

public interface CustomService<T, K, U> {}

CustomServiceImpl (指定泛型具体类型)

如果是一个很抽象没有加任何限定的泛型,那么是获取不到的。

当然如果是实现了接口或者继承了某个类,那么是可以获取到具体的泛型类型的。

public class CustomServiceImplextends BaseService<List<String>>implements CustomService<List<Map<String, Integer>>, BaseService<List<Map<String,Integer>>>, BaseService>  {}

GenericTest 获取类上的泛型示例

public class GenericTest {public static void main(String[] args) {//获取到 CustomServiceImpl 这个类的TypeResolvableType oriType = ResolvableType.forClass(CustomServiceImpl.class);//获取父类,就是extends的那个类,因为java是单继承,所以只会有一个ResolvableType superType = oriType.getSuperType();System.out.println(superType.resolve()); // class com.zzhua.service.BaseServiceSystem.out.println(superType.getGeneric(0).resolve()); // interface java.util.List//获取CustomServiceImpl这个类要实现的接口,因为接口可能会有多个,所以是一个数组ResolvableType[] interfaces = oriType.getInterfaces();for (ResolvableType interfaceResolvableType : interfaces) {System.out.println(interfaceResolvableType.resolve()); // interface com.zzhua.service.CustomService}// 开始进行泛型获取,// 接口定义: public interface CustomService<T, K> {}// 通过最复杂的:CustomServiceImpl implements CustomService<List<Map<String, Integer>>, BaseService> 举例ResolvableType generic1 = interfaces[0].getGeneric(0);System.out.println(generic1.toString()); // java.util.List<java.util.Map<java.lang.String, java.lang.Integer>>System.out.println(generic1.resolve());  // interface java.util.ListResolvableType generic2 = interfaces[0].getGeneric(1); // BaseServiceSystem.out.println(generic2.toString()); // com.zzhua.service.BaseService<?>System.out.println(generic2.resolve());  // class com.zzhua.service.BaseService// 第一个0表示获取的是:Map<String, Integer> ,第二个0表示获取的StringResolvableType generic0_0 = generic1.getGeneric(0, 0);System.out.println(generic0_0.resolve()); // class java.lang.StringResolvableType generic0_1 = generic1.getGeneric(0, 1);System.out.println(generic0_1.resolve()); // class java.lang.Integer// 所以通过以上示例, 可以知道// 1. 先去拿具体的类的ResolvableType,// 2. 具体的类可以拿到它的 父类的ResolvableType(只会有1个父类), 所有实现接口的ResolvableType(可能会有多个)// 3. 继续通过拿到的ResolvableType, 调用它的getGeneric(int... indexes), 里面可传多个参数(表示在泛型中的位置,从0开始)// class java.lang.StringSystem.out.println(ResolvableType.forClass(CustomServiceImpl.class).getInterfaces()[0].getGeneric(1, 0, 0, 0).resolve());// class java.lang.IntegerSystem.out.println(ResolvableType.forClass(CustomServiceImpl.class).getInterfaces()[0].getGeneric(1, 0, 0, 1).resolve());// class com.zzhua.service.BaseServiceSystem.out.println(ResolvableType.forClass(CustomServiceImpl.class).getInterfaces()[0].getGeneric(2).resolve());// CustomServiceImpl的第三个泛型BaseService没有写明具体的泛型类, 因此这里是nullSystem.out.println(ResolvableType.forClass(CustomServiceImpl.class).getInterfaces()[0].getGeneric(2, 0).resolve());}
}

获取字段的泛型

public class  GenericInjectTest {private Map<String, Map<String, Integer>> map;// ....public Map<String, Map<String, Integer>> methodName() {return null;}
}

如果要获取某个字段的泛型,那么可以采用:

ResolvableType resolvableType4 = ResolvableType.forField(ReflectionUtils.findField(GenricInjectTest.class, "map"));    
resolvableType4.getGeneric(1).getGeneric(1).resolve();
// class java.lang.Integer

获取返回值的泛型参数

ResolvableType resolvableType5 = ResolvableType.forMethodReturnType(ReflectionUtils.findMethod(GenricInjectTest.class, "methodName"));  
System.out.println(resolvableType5.getGeneric(1, 0).resolve()); 
// class java.lang.String

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我想跳槽

我是个小文员。公司很小&#xff01;2007年8月来到这个公司的&#xff01;我不喜欢我现在的工作&#xff0c;因为它不是我想要的&#xff01;我喜欢的是关于“IT”方面的工作&#xff0c;当然“IT”这个概念很大&#xff01;我想从事软件开发或者软件测试这方面的工作&#xff…

世界上迄今为止最安全的加密算法

全世界只有3.14 % 的人关注了青少年数学之旅一个只能用算力来破解的加密算法1人类的加密史公元前5世纪&#xff0c;古希腊人使用一根叫scytale的棍子来传递加密信息。要加密时&#xff0c;先绕棍子卷一张纸条&#xff0c;把信息沿棒水平方向写&#xff0c;写一个字旋转一下&…

手把手教你java快速过滤关键词

java过滤关键词 敏感词、文字过滤是一个网站必不可少的功能&#xff0c;如何设计一个好的、高效的过滤算法是非常有必要的。前段时间我一个朋友&#xff08;马上毕业&#xff0c;接触编程不久&#xff09;要我帮他看一个文字过滤的东西&#xff0c;它说检索效率非常慢。我把它程…

[Delphi]根据输入日期按年月周日输出日期段

输入变量ADateStart&#xff0c;并为其填写起始日期&#xff0c;变量ADateEnd&#xff0c;计算类型AType&#xff0c;输出变量ADateStart&#xff0c;变量ADateEnd procedureFormatDateByType(AType:Integer; varADateStart, ADateEnd: TDate); var//type0日 1周 2月 3年 …

TIOBE 发布 8 月编程语言榜单:C# 排名如何?

刚刚 TIOBE 官方最新发布了 8 月的编程语言榜单&#xff0c;一起来看本月榜单中有什么值得关注的发展趋势吧&#xff1f;每一种编程语言的兴起从来都离不开它所适用的技术领域&#xff0c;二者之间一直以来都是水涨船高的关系。数据挖掘和人工智能的蓬勃发展也是如此&#xff0…

两年了,你还是那个你 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源都市音酱&#xff0c;侵权删&#xff09;

Delphi 的字符及字符串[4] - 字符串、字符指针与字符数组

//字符串 < > 字符数组 vararr: array[0..5] of Char;str: string; begin{可以把字符串常量直接赋给字符数组; 但超界不行}arr : Delphi;ShowMessage(arr); {Delphi}{可以把字符数组直接赋给字符串变量}str : arr;ShowMessage(str); {Delphi}{其实字符串内部也是包含了一…

职场智慧之如何提升自己在公司的价值

一个人要想在公司立足&#xff0c;成为公司不可或缺的人才&#xff0c;并得到公司的重用和青睐&#xff0c;只有让自己对公司具有更大的价值&#xff0c;那么如何提升自己在公司的价值呢&#xff1f;1&#xff0e;任务分配&#xff0c;不怕累&#xff0c;多干活任何公司、老总都…

Java IO(一)

【例1】创建一个新文件import java.io.*; class hello{public static void main(String[] args) {File fnew File("D:\\hello.txt");try{f.createNewFile();}catch (Exception e) {e.printStackTrace();}} }【运行结果】&#xff1a;程序运行后&#xff0c;在D盘下会…

Java Dao模式通过JDBC连接数据库的操作

Java程序访问数据库&#xff1a; 1、获取数据库厂商提供的驱动&#xff08;jdbc接口的实现类&#xff09; 如ojdbc14.jar——Oracle数据库驱动jar包 mysql-connector-java-5.1.8-bin.jar——MySQL数据库驱动jar包 自己去网上下载就行。 2、使用JDBC的API访问数据库 连接、…

k8s入门你至少需要会哪些

前言相信很多公司都有集成发布pass系统&#xff0c;底层大多数依赖于k8s来进行服务的发布部署/回滚等功能。对于很多业务开发者都是不可见的&#xff0c;在感叹这个东西真好用的同时&#xff0c;想着探一探这背后的原理。今天这篇k8s入门我整理了必会的几个k8s知识点&#xff0…

Windows CE的电源管理之三

本篇将以Windows Mobile为例介绍Windows CE电源管理的实现&#xff0c;大体上&#xff0c;Windows Mobile分为Pocket PC和Smartphone两种版本。这两者之间的主要区别在于触摸屏和电源模型&#xff0c;Smartphone采用的是“Always On”模型。为了说清楚它们的区别&#xff0c;我…

跟你们讲一个鬼故事,TA回来了!

全世界只有3.14 % 的人关注了青少年数学之旅真正决定人与人之间的差距的&#xff0c;其实是我们对事物的见识与内心的格局&#xff0c;见识的深浅决定人生的深浅&#xff0c;格局的大小决定了人生之路是宽是窄。今天给大家推荐几个有深度、有想法的公众号&#xff0c;希望能够给…

java之static关键词的作用

static关键词的作用 1、静态成员变量的语法特定 2、静态函数的语法特定 3、静态代码块的语法特定 定义静态成员变量 Person.java class Person{ static int a; }按照以前可以这么调用 public class Test1{ public static void main(String[] args){ Person person new Per…

分布式事务最终一致性-CAP框架轻松搞定

前言对于分布式事务&#xff0c;常用的解决方案根据一致性的程度可以进行如下划分&#xff1a;强一致性(2PC、3PC)&#xff1a;数据库层面的实现&#xff0c;通过锁定资源&#xff0c;牺牲可用性&#xff0c;保证数据的强一致性&#xff0c;效率相对比较低。弱一致性(TCC)&…

Cus系统beta1.2发布

2019独角兽企业重金招聘Python工程师标准>>> 经过小伙伴的努力&#xff0c;Cus后台管理系统开发完成&#xff0c;完善了后台系统&#xff0c;权限控制&#xff0c;新闻发布&#xff0c;商务合作等等功能 主要功能包括&#xff1a; 后台系统截图 更多后台系统截图请点…

如何打开网页链接

System.Diagnostics.Process.Start("http://news.163.com") 转载于:https://www.cnblogs.com/habin/archive/2008/03/10/1099285.html

区区6位密码,凭什么守护我的百万家产?

全世界只有3.14 % 的人关注了青少年数学之旅今天超模君非常的开心你问为什么&#xff1f;当然是——又双叒可以买新的数学书好开心&#xff01;不过在这欢快的气氛中超模君却听见了小天的叹气声玩笑归玩笑但是银行的密码系统真很安全的吗&#xff1f;今天我们就来讨论下密码学的…

在ie6下实现position-fixed的效果--------续集---对联效果(02)

在ie6下实现position-fixed的效果&#xff0c;这回是实现的对联效果&#xff0c;没有JS在里面的对联效果&#xff0c;但是没有JS的动感。 这个的原理是和《在ie6下实现position-fixed的效果》的是一样的。CSS&#xff1a;1 <style type"text/css">2 *{margin:0…

狐狸和猫

一只猫在森林里遇到一只狐狸&#xff0c;心想&#xff1a;"他又聪明&#xff0c;经验又丰富&#xff0c;挺受人尊重的。"于是它很友好地和狐狸打招呼&#xff1a;"日安&#xff0c;尊敬的狐狸先生&#xff0c;您好吗&#xff1f;这些日子挺艰难的&#xff0c;您…