为什么这会因错误而失败:
Args are: -normi -nosplash
Exception in thread "main" java.lang.IllegalArgumentException: wrong
number of arguments
at sun.reflect.NativeConstructorAccessorImpl
.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl
.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl
.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at TSStack.main(TSStack.java:14)
以下是代码:
public static void main(String args[]) throws Exception {
System.out.println("Args are: " + args[0]+ " " + args[1] );
try {
Constructor<Site> c = Site.class.getDeclaredConstructor();
c.setAccessible(true); // use reflection to get access to
//this private constructor
c.newInstance( (Object[])args );
} catch (InvocationTargetException x) {
x.printStackTrace();
} catch (NoSuchMethodException x) {
x.printStackTrace();
} catch (InstantiationException x) {
x.printStackTrace();
} catch (IllegalAccessException x) {
x.printStackTrace();
}
}
答案 0 :(得分:4)
当你有这一行时:
Site.class.getDeclaredConstructor();
您正在获取不带参数的Site
类的构造函数,因为getDeclaredConstructor
是一个可变参数函数,它接受描述参数的Class<?>
对象列表作为参数类型。既然你没有列出任何东西,那你就得到了一个无效的构造函数。
但是,您可以尝试通过调用
来创建对象c.newInstance( (Object[])args );
这会尝试传入args
作为参数。除非args
为空,否则会导致问题,因为您明确要求使用无参数构造函数。
编辑:由于您正在寻找的构造函数(基于您的上述注释)想要将可变数量的String
s作为参数,您想要查找一个构造函数(我相信)接受一个String
s数组作为其参数,因为内部可变参数函数是使用数组实现的。你可以这样做:
Constructor<Site> c = Site.class.getDeclaredConstructor(String[].class);
c.setAccessible(true); // use reflection to get access to this private constructor
c.newInstance( (Object[])args );
更重要的是,你为什么要使用反射呢?只需编写
,它就更快,更清洁,更安全new Site(args);
这允许Java静态验证代码的安全性。
希望这有帮助!
答案 1 :(得分:3)
Site.class.getDeclaredConstructor()
将返回没有参数的默认构造函数,因此您必须向它传递一个空数组的参数,这在您的示例中并非如此(否则您将在System.out.println()
的第一行失败)。