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例外?任何解决方案吗?
答案 0 :(得分:6)
因为省略号是数组的语法糖。
你应该:
s.getDeclaredConstructor(int.class, char.class, String[].class);
(正如@JonSkeet在他的回答中提到的,你也应该在.newInstance()
调用中使你的第三个参数成为一个数组)
答案 1 :(得分:4)
为什么这段代码给了我许多方法的例外?
因为您没有包含您所请求参数的构造函数:
(int, char, String, String)
您只有一个包含以下参数的构造函数:
(int, char, String[])
其中String[]
是varargs参数。
存在varargs参数的事实基本上是编译时工件。您可以使用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])