
反射动态创建泛型类中泛型对应类的实例
发布日期:2021-05-08 13:44:34
浏览次数:17
分类:精选文章
本文共 1096 字,大约阅读时间需要 3 分钟。
在Java编程中,抽象类BaseAction的构造方法通常用于子类初始化时的逻辑处理。本文将详细介绍如何通过反射机制动态创建子类模型实例。
1. 获取子类类型
在BaseAction的构造方法中,首先需要获取当前运行时的子类类型。通过this.getClass()
可以获取当前实例的类信息。例如:
Class clz = this.getClass();
此方法返回的是当前运行时的具体子类类型。
2. 获取泛型父类
接下来,需要获取当前子类的泛型父类信息。使用getGenericSuperclass()
方法可以获取类的泛型父类。需要注意的是,这里的泛型父类并不是直接的BaseAction类,而是具体的子类继承自BaseAction的实现。
3. 转换为具体类型
由于getGenericSuperclass()
返回的是Type
类型,需要将其转换为具体的ParameterizedType
类型。可以通过以下代码实现:
Type type = clz.getGenericSuperclass();ParameterizedType pt = (ParameterizedType) type;
通过上述方法,我们可以获取到具体的泛型参数信息。
4. 获取具体泛型类
然后,需要从参数化的类型中获取具体的泛型类。使用pt.getActualTypeArguments()
方法可以获取所有实际使用的类型参数。例如:
Class modelClass = (Class) pt.getActualTypeArguments()[0];
这里假设BaseAction的泛型定义为<T extends Model>
, 所以getActualTypeArguments()
返回的数组中第一个元素就是T
的具体类型。
5. 创建模型实例
最后,使用反射机制创建具体的模型实例。可以通过modelClass.getConstructor()
获取无参数的构造器,并使用newInstance()
方法创建实例。需要注意的是,需要处理可能出现的异常。完整代码如下:
try { Class modelClass = (Class) pt.getActualTypeArguments()[0]; model = (T) modelClass.getConstructor().newInstance();} catch (Exception e) { e.printStackTrace();}
通过以上步骤,我们可以动态地根据子类类型创建对应的模型实例。这种方式在需要灵活性的场景中非常有用。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年03月30日 20时37分47秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
lvs+keepalive构建高可用集群
2019-03-05
Mysql高可用架构(主从同步)
2019-03-05
mysql主从延迟高的原因
2019-03-05
ATS缓存数据结构
2019-03-05
glob模块
2019-03-05
6 个 Linux 运维典型问题
2019-03-05
oracle无法启动asm实例记录
2019-03-05
取消vim打开文件全是黄色方法
2019-03-05
一个系统部署多个tomcat实例
2019-03-05
HP服务器设置iLO
2019-03-05
从头实现一个WPF条形图
2019-03-05
.NET CORE(C#) WPF 方便的实现用户控件切换(祝大家新年快乐)
2019-03-05
C# WPF开源控件库:MahApps.Metro
2019-03-05
使用QT实现一个简单的登陆对话框(纯代码实现C++)
2019-03-05
QT :warning LNK4042: 对象被多次指定;已忽略多余的指定
2019-03-05
GLFW 源码 下载-编译-使用/GLAD配置
2019-03-05
针对单个网站的渗透思路
2019-03-05
Typescript 学习笔记六:接口
2019-03-05
【ASP.NET】ASP.NET中权限验证使用OnAuthorization实现
2019-03-05