【问题标题】:Instantiating Java class with getDeclaredConstructor raises IllegalArgumentException使用 getDeclaredConstructor 实例化 Java 类会引发 IllegalArgumentException
【发布时间】:2013-06-04 11:30:29
【问题描述】:

我有 String[] 构造函数的类(没有默认构造函数):

我需要按名称动态构造一个实例:

package tests;

import java.lang.reflect.Constructor;

interface I {

}

class A implements I {
    public A(String[] args) {
        System.out.printf("Args = %s", args.toString());
    }
}

public class DynaCon {
    public static void main(String[] args) throws Exception {
        @SuppressWarnings("unchecked")
        Class<I> clz = (Class<I>) Class.forName("tests.A");
        Constructor<I> ctr = clz.getDeclaredConstructor(args.getClass());
        ctr.newInstance(args);
    }

}

为什么会引发 IllegalArgumentException?

【问题讨论】:

    标签: java reflection dynamic-programming variadic-functions


    【解决方案1】:

    这是可变参数的问题。试试:

    I obj = ctr.newInstance(new Object[] { a });
    

    Constructor.newInstance 定义为T newInstance(Object... initargs)。由于String[]Object[](在J2SE 5.0 之前工作),因此您尝试使用单个String-accepting 参数调用构造函数。

    【讨论】:

    • 那不编译。我更新了上面的代码,直接从已编译的 java 文件中粘贴。
    • 您已将问题中的 a 变量更改为 args。除此之外,我不知道问题是什么。你得到什么编译器错误?
    • jdk 7. 我也试过我 obj = ctr.newInstance((new Object[]) args),即一个演员,但没有奏效。当我将它分成两个语句时,转换确实有效,newInstance 调用失败。
    • 显然我在某个地方确实有一个错字,我现在无法创建。但这个答案是正确的。
    • @newacct 你想对该评论做出任何解释吗?
    【解决方案2】:

    Tom Hawtin 是正确的,字符串数组被扩展为可变参数参数。典型的解决方案是将其强制转换为非数组类型:

    I obj = ctr.newInstance((Object)a);
    

    【讨论】:

      猜你喜欢
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      相关资源
      最近更新 更多