首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >反射-使用未知数量的构造函数参数获取未知类的新实例

反射-使用未知数量的构造函数参数获取未知类的新实例
EN

Stack Overflow用户
提问于 2017-08-25 19:01:07
回答 2查看 1K关注 0票数 1

首先,我对思考还很陌生。我一直在做一个大型项目,我需要在某些部分使用反射(是的,我肯定需要它)。所以我想,我应该创建一个反射助手类,它将能够在我的项目中创建具有任意数量参数的任何类的新实例。

作为我的问题的一个例子:通常(据我所知),创建一个在其构造函数中有2个字符串作为参数的类的实例;

代码语言:javascript
运行
AI代码解释
复制
Class.getConstructor(String.class, String.class).newInstance("Arg_1", "Args_2");

就能完成这项工作。然而,在我的例子中,我需要一个方法,它可以用于任何具有任何构造函数的类。所以我创建了这些方法,但它似乎不起作用,我一直得到NoSuchMethodException。我需要帮助才能让它起作用。

代码语言:javascript
运行
AI代码解释
复制
private static String packagePrefix = "com.***";

public static Class<?> getClass(String className) throws ClassNotFoundException {
    return Class.forName(packagePrefix + "." + className);
}

public static Object getClassInstance(String className, Object... args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
    Class<?>[] cArgs = new Class[args.length];
    for (int i = 0; i < args.length; i++) {
        cArgs[i] = args[i].getClass();
    }
    return getClass(className).getConstructor(cArgs).newInstance(args);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-25 19:29:23

一般来说,你不能“用任意数量的参数创建任何类的新实例”。如果没有这样的构造函数,那么你将无法调用它。

接下来,Class.getConstructor查找具有给定形参类型的构造函数,而不是与赋值兼容的类型。所以,如果你有Foo(Number),你不会在Foo.class.getConstructor(Long.class)中找到这个构造器。您必须遍历Class.getConstructors并搜索构造函数,该构造函数具有参数类型、与赋值兼容的参数类型。

幸运的是,这已经被做了一千次了。例如,参见来自Commons BeanUtilsConstructorUtils.invokeConstructor。其实现远非微不足道。

票数 3
EN

Stack Overflow用户

发布于 2017-08-25 22:40:40

在你的评论中,你说你有一个接受4个参数的类

代码语言:javascript
运行
AI代码解释
复制
Skill(Monster m, Integer procChance, Integer duration, Integer severity)

但您尝试仅使用3个参数来反射地创建它:

代码语言:javascript
运行
AI代码解释
复制
Skill skill = (Skill) ReflectionHelper.getClassInstance(skillPackagePrefix + skillType.getName(), monster, procChance, params);

即使param是一个包含2个整数的数组(正如您所注释的),它也会被Java视为数组参数,并且不会被合并到Object... args变量中。上面的代码只适用于下面的构造函数:

代码语言:javascript
运行
AI代码解释
复制
Skill(Monster m, Integer procChance, Integer[] params)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45887927

复制
相关文章
Excel催化剂开源第3波-修复ExcelCom加载项失效问题及WPS可调用Com加载项的方法
为了还原一个干净无侵扰的网络世界,本文将不进行大规模地分发,若您觉得此文有用,不妨小范围地分享到真正有需要的人手中
Excel催化剂
2021/08/19
1.2K0
解决Excel下挪动加载项(.xlam)后,重新加载xlam还是每次启动Excel都报错的问题
问题描述:Excel加载了一个插件,但是因为目录调整自己挪动了位置,即使重新加载该插件,每次重启Excel还是报之前找不到插件的问题,虽然能使用,但是每次都报错很烦。
williamwong
2021/09/26
2.7K0
解决Excel下挪动加载项(.xlam)后,重新加载xlam还是每次启动Excel都报错的问题
如何确保安装并加载VBA加载项文件
在某些情形下,可能希望将加载项中的代码合并到其他VBA过程中,或者允许其他人访问你的加载项。此时,为了防止加载项卸载或未安装而导致出错,可以使用VBA代码确保加载项正确加载到你正在使用的任一Microsoft Office程序中。
fanjy
2023/08/30
3200
如何确保安装并加载VBA加载项文件
前端|对wps加载项的探究
WPS 加载项是一套基于 Web 技术用来扩展 WPS 应用程序的解决方案。每个 WPS 加载项都对应打开了一个网页,并通过调用网页中 JavaScript 方法来完成其功能逻辑。WPS 加载项打开的网页可以直接与 WPS 应用程序进行交互,同时一个 WPS 加载项中的多个网页形成了一个整体, 相互之间可以进行数据共享。开发者不必关注浏览器兼容的问题,因为 WPS 加载项的底层是以 Chromium 开源浏览器项目为基础进行的优化扩展。
算法与编程之美
2020/03/25
3.5K0
前端|npm全局创建wps加载项
基于vscode的方式创建wps加载项在获取类型之后,无法自动生成wps加载项,在网上查询相关问题内容也无果。不过Wps官方文档又更新了通过npm全局的方式创建wps加载项,下面就来具体介绍一下。
算法与编程之美
2020/03/31
1.9K0
js 数组去除重复数据-当WPS开始像支持VBA一样支持JS语言时,微软又该何去何从?
  有朋友留言说,微软早就在Office里也支持JS了,比如Script Lab……其实关于Script Lab,二年前我们就聊过一次。今天就再大家详细聊一下,这主要包含了以下内容:
宜轩
2022/12/26
2.6K0
IE Flash10b.ocx加载项失败 解决
在做一个页面的视频录制时,预览页面时,总会提示Flash10b.ocx加载项失败 ,导致IE被迫关闭,很是恼火。在网上搜了下,原来是原来是Adobe Flash player控件出的问题,10.0的版本加载IE会出现那样的问题。按照网上所说,将Adobe Flash player 10.0 卸载了,安装了Adobe Flash player 9.0的试了下尽可以了。就将此记录了
全栈程序员站长
2022/09/06
9180
真正彻底卸载ie8的某些加载项
但是,有的加载项“删除”不可选的,这时如果是你不想要的或流氓加载项咋办?如果你不只是禁用掉它,还需要永久删除掉它,怎么办?
williamwong
2018/07/24
8350
真正彻底卸载ie8的某些加载项
震惊!当Python遇到Excel后,将开启你的认知虫洞
本文主要讲Python与Excel的关系以及集成方案,Office家族的其他成员,如Word、PowerPoint与Excel拥有类似的功能,Python同样可以与Word、PowerPoint等Office成员结合,这些内容我以后会写文章讲解。
蒙娜丽宁
2020/06/03
3.6K0
web未能加载文件或程序集“XXX”或它的某一个依赖项
如果你将应用程序生成x86而不是Any CPU时,在64位操作系统中不会出错错误,而在32位操作系统中可能会出现以下错误
Python进阶者
2021/08/25
2.1K0
web未能加载文件或程序集“XXX”或它的某一个依赖项
如果你将应用程序生成x86而不是Any CPU时,在64位操作系统中不会出错错误,而在32位操作系统中可能会出现以下错误
前端皮皮
2020/11/26
1.5K0
web未能加载文件或程序集“XXX”或它的某一个依赖项
异常:System.BadImageFormatException,未能加载正确的程序集XXX或其某一依赖项
常:System.BadImageFormatException,未能加载正确的程序集XXX或其某一依赖项
跟着阿笨一起玩NET
2018/09/19
5.8K0
异常:System.BadImageFormatException,未能加载正确的程序集XXX或其某一依赖项
一项新特性提升MergeTree加载性能200倍
大家知道 MergeTree 是以分区目录的形式组织数据的,只要每写入一次数据,就会在磁盘上创建一个新分区文件(parts)。随着时间的推移,相同分区的文件会被合并成一个,关于这一块的逻辑可以看我的早期文章,《传送门》。
Nauu
2022/08/30
7390
WordPress移除head头部js、css、feed等多余加载项
在我们开发WordPress主题时,细心的小伙伴或发现网站头部如果加载head页面就会出现很多系统自带的加载项目,例如自带的css、js、feed、style等多余信息。
开心分享
2020/08/06
2.6K0
Excel技巧 – VLOOKUP(查找项,匹配数据项,使用匹配数据项序号,匹配条件) – 函数填充指定内容
在使用VLOOKUP的时候,请使用绝对引用:https://www.zanglikun.com/17999.html
收心
2023/08/24
1K0
Excel技巧 –  VLOOKUP(查找项,匹配数据项,使用匹配数据项序号,匹配条件) – 函数填充指定内容
python 加载excel报错
file1=pd.read_excel('F:/dataanalysis/statistics/PelicanStores.xlsx')
py3study
2020/01/06
9230
SpringBoot获取配置项原内容
那么使用该工具类getProperty("my.url")获取到的就是 https://${my.name}.com 原文, 而不是 https://test.com
code-x
2023/02/23
9720
小程序如何针对某次请求设置超时时间的加载项?
1、点击[编辑器] 2、点击[pagePath] 3、点击[文本] 4、点击[新建] 5、点击[文件夹] 6、点击[images] 7、点击[images] 8、点击[selectedIconPath] 9、点击[iconPath] 10、点击[编译] 11、点击[text] 12、点击[编译] 13、点击[编辑器] 14、点击[编译] 15、点击[编辑器] 16、点击[编译] 17、点击[编辑器] 18、点击[编辑器] 19
裴来凡
2022/05/28
2.3K0
小程序如何针对某次请求设置超时时间的加载项?
判断图片是否加载完成
有时需要获取图片的尺寸,这需要在图片加载完成以后才可以。有三种方式实现,下面一一介绍。 1、load事件 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>img - load event</title> </head> <body> <img id="img1" src="http://pic1.win4000.com/wallpaper/f/51c3bb99a21ea.jpg"> <p id="p1">loading...</p> <
前朝楚水
2018/04/02
4.6K0
点击加载更多

相似问题

如何检查office文档excel是否为只读office.js加载项

13

Excel Office.js加载项在Windows10上不再正确加载

37

Microsoft Excel加载项-如何知道它是否已经安装。office.js

13

使加载项在Excel 2016 for Windows中可用

10

OSX是否支持Office加载项?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文