当构造函数将一个字符串数组作为参数时,使用反射创建对象实例

时间:2014-09-01 16:58:05

标签: java reflection

我正在尝试创建一个只有以下构造函数的类的实例,覆盖默认构造函数

public HelloWorld(String[] args)

我正在做以下

Class reflect;
HelloWorld obj = null;
//some logic to generate the class name with full path
reflect = Class.forName(class_name);

然后我正在尝试为这个类创建一个对象

 obj = (HelloWorld)reflect.getConstructor(String[].class)
                          .newInstance(job1.arg_arr());

arg_arr()用于将列表转换为字符串数组

public String[] arg_arr(){
    String arg_list[]=new String[args.size()];
    return args.toArray(arg_list);
}

尝试创建实例时,我得到以下堆栈跟踪 java.lang.IllegalArgumentException

wrong number of arguments

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)  
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)  
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)  
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)  
at processmigration.Process_manager.eval(Process_manager.java:175)  
at processmigration.Process_manager.run(Process_manager.java:147)  
at java.lang.Thread.run(Thread.java:745)

我想知道出了什么问题,因为我只将一个参数传递给newInstance(),就像我想要创建的类的构造函数一样。

2 个答案:

答案 0 :(得分:2)

newInstance会带一个Object...参数,所以当你给它一个String []时,它会将它作为Object[]传递。

你想要的是以下内容,它告诉你只传递一个参数,而不是数组的内容作为参数。

.newInstance((Object) job1.arg_arr())

答案 1 :(得分:1)

解决方案如下:

执行getConstructor(...)和newInstance(...)时,所有参数都必须在1个数组中。因此,我创建了数组params和argsToPass并将args存储在其中。 否则,你的String []就是一个参数列表而不只是一个参数。

Class reflect;
    HelloWorld obj = null;
    //some logic to generate the class name with full path
    reflect = HelloWorld.class;
    Class[] params = new Class[1];
    params[0] = String[].class;
    Object[] argsToPass = new Object[1];
    argsToPass[0] = job1.arg_arr();
    obj = (HelloWorld)reflect.getConstructor(params).newInstance(argsToPass);

编辑:经过测试的代码 - 有效!!