【问题标题】:Java.lang.Class.newInstance() throws IllegalArgumentExceptionJava.lang.Class.newInstance() 抛出 IllegalArgumentException
【发布时间】:2014-09-18 12:00:51
【问题描述】:

我有一个简单的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 在其构造函数中没有参数时,它可以毫无问题地调用。

【问题讨论】:

    标签: java jar javafx


    【解决方案1】:

    您需要创建一个对象数组,并将t 放入其中,如下所示:

    clazz.getDeclaredConstructor(String[].class).newInstance(new Object[]{t});
    

    Demo.

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

    【讨论】:

    • 现在一切正常。非常感谢。 PS这就是为什么IDE对我大喊大叫Type String[] of the last argument to method newInstance(Object...) doesn't exactly match the vararg parameter type. Cast to Object[] to confirm the non-varargs invocation, or pass individual arguments of type Object for a varargs invocation.
    猜你喜欢
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    相关资源
    最近更新 更多