使用Java Constructor.newInstance(args),为什么“错误的args数”错误?

时间:2011-07-24 00:59:25

标签: java class instance

为什么这会因错误而失败:

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();
          }     
}

2 个答案:

答案 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()的第一行失败)。