Java.lang.Class.newInstance()抛出IllegalArgumentException

Java.lang.Class.newInstance()抛出IllegalArgumentException,java,jar,javafx,Java,Jar,Javafx,我有一个简单的Start类,它带有publicstart(String[]params)构造函数,我是从一个不可运行的JAR文件调用它的,这个JAR文件是从其他运行的Java程序级别调用的。一切都在运行时环境中工作。当我试图调用newInstance()方法来调用这个Start类时,问题就出现了 类Start如下所示: public class Start { public Start(String[] params) { /* initialize MainStag

我有一个简单的
Start
类,它带有
publicstart(String[]params)
构造函数,我是从一个不可运行的JAR文件调用它的,这个JAR文件是从其他运行的Java程序级别调用的。一切都在运行时环境中工作。当我试图调用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
    }
}
clazz.getDeclaredConstructor(String[].class).newInstance(new Object[]{t});
这就是我调用
Start
class的方式:

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();
}
String[]t=新字符串[]{“一”、“二”、“三”};
试一试{
Class clazz=Class.forName(“org.plugin.Start”);
/*下面的行抛出了提到的异常*/
clazz.getDeclaredConstructor(字符串[].class).newInstance((对象[])t);
}捕获(例外e){
e、 printStackTrace();
}

值得一提的是,除了这个
IllegalArgumentException
之外的一切都非常完美,这意味着-JAR被添加到运行时类路径中,类
Start
在其构造函数中没有参数的情况下,调用起来没有问题。

您需要创建一个对象数组,并将
t
放入其中,像这样:

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
    }
}
clazz.getDeclaredConstructor(String[].class).newInstance(new Object[]{t});


Java告诉您传递了无效数量的参数的原因是代码将包含三个元素的数组
t
传递给一个只接受一个数组参数的构造函数。换句话说,您缺少了一个额外级别的间接寻址,因为传递给方法或构造函数的参数需要包装在
Object[]
中,该对象每个函数参数有一个元素。

现在一切都可以完美地工作。非常感谢你。这就是为什么IDE对我大喊大叫,方法newInstance(Object…)的最后一个参数的类型String[]与vararg参数类型不完全匹配。强制转换到对象[]以确认非varargs调用,或为varargs调用传递Object类型的单个参数。