我有一个带有Start
构造函数的简单public Start(String[] params)
类,我从其他正在运行的Java程序级别的不可运行的JAR文件中调用它。一切都在运行时环境中工作。当我尝试调用newInstance()方法时,会出现问题,以便调用此Start
类。
班级Start
如下所示:
public class Start {
public Start(String[] params) {
/* initialize MainStage object */
MainStage stage = new MainStage(params);
stage.show();
// MainStage DO NOT have any restriction about params.length
}
}
这就是我调用Start
类的方式:
String[] t = new String[] {"One", "Two", "Three"};
try {
Class<?> clazz = Class.forName("org.plugin.Start");
/* line below throws the mentioned exception */
clazz.getDeclaredConstructor(String[].class).newInstance((Object[]) t);
} catch (Exception e) {
e.printStackTrace();
}
值得一提的是,除了IllegalArgumentException
之外的所有内容都是完美的,这意味着 - JAR被添加到运行时类路径中,类Start
在没有参数的情况下调用没有问题它的构造函数。
答案 0 :(得分:2)
您需要创建一个对象数组,并将t
放入其中,如下所示:
clazz.getDeclaredConstructor(String[].class).newInstance(new Object[]{t});
Java告诉您传递了无效数量的参数的原因是您的代码将t
(一个包含三个元素的数组)传递给采用单个数组参数的构造函数。换句话说,您缺少额外的间接级别,因为传递给方法或构造函数的参数需要包含在Object[]
中,每个函数参数都有一个元素。