import java.lang.reflect.Constructor;
class tr1 {
public static void main(String[] args) {
try {
if (args.length < 1)
throw(new Exception("baby its wrong"));
Class s = Class.forName(args[0]);
Constructor c = s.getDeclaredConstructor(int.class, char.class, String.class, String.class);
Object o = c.newInstance(Integer.parseInt(args[1]), args[2].charAt(0), args[3], args[4]);
System.out.println("description of object " + o);
} catch (Exception e) {
System.out.println(e);
}
}
}
class A {
public A(int a, char c, String... strings){
System.out.println(a);
System.out.println(c);
for (String q:strings) {
System.out.println(q);
}
}
}
为什么这段代码给我NoSuchMethod
异常?有解决办法吗?
为什么这段代码没有给我suchmethod异常?
因为你没有一个带有你所请求的参数的构造函数:
(int, char, String, String)
构造函数只有以下参数:
(int, char, String[])
,其中String[]
是一个变量参数。
Constructor.isVarArgs()
检测到这一点,但这不会改变构造函数的签名。
有解决方案吗?
使用现有的构造函数:)
Constructor c = s.getDeclaredConstructor(int.class, char.class, String[].class);
Object o = c.newInstance(Integer.parseInt(args[1]),
args[2].charAt(0),
new String[] { args[3], args[4] });
创建一个传递给构造函数的String[]
,基本上就是如果你调用
new A(Integer.parseInt(args[1]), args[2].charAt(0), args[3], args[4])
因为省略号是数组的语法糖。
你应该:
s.getDeclaredConstructor(int.class, char.class, String[].class);
(正如@JonSkeet在他的回答中提到的,您还应该使您的第三个参数在.newInstance()
调用中成为一个数组)