我正在尝试创建一个只有以下构造函数的类的实例,覆盖默认构造函数
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(),就像我想要创建的类的构造函数一样。
答案 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);
编辑:经过测试的代码 - 有效!!