解析类的泛型参数 Spring之GenericTypeResolver.resolveTypeArgument

ops/2024/11/30 10:42:40/

GenericTypeResolver 是 Spring 的一个实用类,提供了在运行时解析泛型类型信息的能力。它包含了若干静态方法,可以用于解析类的泛型参数。GenericTypeResolver.resolveTypeArgument 方法可以用于解析一个具体类实现指定的泛型接口时,实际的泛型类型。

以下是如何使用 GenericTypeResolver.resolveTypeArgument 的具体说明和例子。

1. 场景

假设你有一个泛型接口:

java">public interface MyService<T> {void process(T item);
}

 

有一个实现类:

java">public class MyServiceImpl implements MyService<String> {@Overridepublic void process(String item) {System.out.println("Processing: " + item);}
}

 

你希望能在运行时确定 MyServiceImpl 这个类实现 MyService 接口时,使用的泛型参数类型是 String

2. 使用 GenericTypeResolver

可以通过GenericTypeResolver来解析这种类型信息。具体代码如下:

 
java">import org.springframework.core.GenericTypeResolver;public class GenericTypeResolverExample {public static void main(String[] args) {Class<?> typeArgument = GenericTypeResolver.resolveTypeArgument(MyServiceImpl.class, MyService.class);if (typeArgument != null) {System.out.println("The type argument for MyService is: " + typeArgument.getName());} else {System.out.println("Could not resolve type argument.");}}
}

 

上述代码的运行结果应该是:

The type argument for MyService is: java.lang.String

3. 原理解释

GenericTypeResolver.resolveTypeArgument 方法的签名如下:

java">public static Class<?> resolveTypeArgument(Class<?> clazz, Class<?> genericIfc)
  • clazz:实现了泛型接口的具体类。
  • genericIfc:泛型接口的Class对象。

这个方法会尝试解析clazz类实现genericIfc接口时,用到的实际泛型类型参数。如果解析成功,它会返回实际的类型参数,例如 String.class;如果解析失败(例如类型信息在运行时被擦除或者无法解析),它会返回 null

4. 泛型类中的泛型方法

如果你需要解析泛型类中的泛泛型方法,可以使用 resolveReturnTypeForGenericMethod 方法。下面是一个简单例子:

假设你有一个泛型类:

java">public class GenericClass<T> {public T get() {return null;}
}

 

然后你创建了一个泛型类的子类:

java">public class StringGenericClass extends GenericClass<String> {@Overridepublic String get() {return "Hello, World!";}
}

 

你可以通过以下方法来解析 get 方法的返回类型:

 

 

java">import org.springframework.core.GenericTypeResolver;import java.lang.reflect.Method;public class GenericMethodExample {public static void main(String[] args) throws NoSuchMethodException {Method method = StringGenericClass.class.getMethod("get");Class<?> returnType = GenericTypeResolver.resolveReturnType(method, StringGenericClass.class);if (returnType != null) {System.out.println("The return type of `get` method is: " + returnType.getName());} else {System.out.println("Could not resolve return type.");}}
}

输出结果应该是:

The return type of `get` method is: java.lang.String

5. 总结

通过 GenericTypeResolver.resolveTypeArgument 和 GenericTypeResolver.resolveReturnType 等方法,可以在运行时解析泛型的实际类型参数。这对于需要动态类型信息的情况非常有帮助。注意,泛型类型参数在某些情况下(例如类型擦除)可能无法解析,因此要做好处理返回 null 的情况。

这些实用工具极大地增强了类型安全性和动态类型解析能力,使得Spring框架可以更好地进行依赖注入和其它高级特性。


http://www.ppmy.cn/ops/137904.html

相关文章

Git 的使用

Git 初始 个人本机使用&#xff1a;Git 基础命令和概念 多人共享使用&#xff1a;团队开发同一个项目的代码版本管理 Git 安装 检验安装是否成功&#xff1a; 打开 bash 终端&#xff08;git 专用&#xff09; 命令&#xff1a;git -v&#xff08;查看版本号&#xff09;…

黑客基础之html(超文本标记语言)

黑客基础之html&#xff08;超文本标记语言&#xff09; HTML&#xff08;超文本标记语言&#xff09;是一种用于创建网页的标准标记语言。它描述了网页的结构和内容&#xff0c;通过一系列的元素和标签来定义文本、图像、链接、表格、表单等网页元素。HTML不是一种编程语言&a…

uniapp的video组件截图(抓拍)功能,解决截后为黑图bug

废话不多说先上代码&#xff01;&#xff01;&#xff01;&#xff01; 点击截图按钮触发以下方法 getCapture() {let _this thislet pages getCurrentPages();let page pages[pages.length - 1];let ws page.$getAppWebview();let bitmap new plus.nativeObj.Bitmap(te…

[HNCTF 2022 WEEK2]TTTTTTTTTea

下载附件&#xff0c;用ida打开。 反编译&#xff0c;查看源码。 v4感觉就是密文&#xff0c;进入tea_encrypt中查看加密方式&#xff1a; 就是一个数据转换。 在查看key&#xff0c;找到密钥。 这里是需要转换为四个八位的数&#xff0c;因为一个int是四个字节&#xff0c;一…

开发中使用UML的流程_04 CIM-3:定义系统范围

CIM-1和CIM-2的生成文件&#xff0c;跟CIM-3的生成文件之间&#xff0c;有如下的关联性&#xff1a;。CIM-2活动图中的每一个动作&#xff0c;都可能成为CIM-3的系统用例。 。CIM-1中的业务执行者&#xff0c;以及CIM-2中的动作负责人&#xff0c;都可能成为CIM-3的系统执行者(…

【eNSP】ISIS动态路由协议实验

和OSPF一样&#xff0c;IS-IS也是一种基于链路状态并使用最短路径优先算法进行路由计算的一种IGP协议。IS-IS最初是国际化标准组织ISO为它的无连接网络协议CLNP设计的一种动态路由协议。 为了提供对IP的路由支持&#xff0c;IETF在RFC1195中对IS-IS进行了扩充和修改&#xff0c…

三菱A800变频器关于操作面板(FR-DU08)

操作面板的各部分名称(FR-DU08) 关于参数设定模式 在参数设定模式中可对变频器各种功能(参数)进行设定。 说明关于参数设定模式的显示画面。 变更参数设定值 变更示例 变更 Pr.1上限频率。

Qt中模拟鼠标消息并与系统鼠标消息进行区分

功能使用场景&#xff1a; 开发一个教学系统&#xff0c;包含了教师端、学生端&#xff0c;并且教师端支持示教功能。此时&#xff0c;学生端的鼠标、键盘不响应系统事件&#xff0c;但需要响应教师端发过来的鼠标移动、按下消息。 因为共享页面相同&#xff0c;为了提高局域…