Используя Java Constructor.newInstance (args), почему ошибка «неправильное количество аргументов»? - PullRequest
0 голосов
/ 24 июля 2011

Почему это не с ошибкой:

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 ]

4 голосов
/ 24 июля 2011

Если у вас есть эта строка:

Site.class.getDeclaredConstructor();

Вы получаете конструктор для класса Site, который не принимает аргументов, поскольку getDeclaredConstructor - это функция с переменным числом, которая принимает в качестве аргументов aсписок Class<?> объектов, описывающих типы аргументов.Поскольку вы ничего не перечислили, вы возвращаете нулевой конструктор.

Однако затем вы пытаетесь создать объект, вызывая

c.newInstance( (Object[])args );

. Попытка передать args какаргументы.Если args не пусто, это вызовет проблему, поскольку вы явно запросили конструктор без аргументов.

EDIT : поскольку вы ищете конструктор (на основе вашегокомментарий выше) хочет принять переменное число 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 статически проверять безопасность вашего кода.

Надеюсь, это поможет!

3 голосов
/ 24 июля 2011

Site.class.getDeclaredConstructor() вернет вам конструктор по умолчанию без аргументов, поэтому вы должны передать ему пустой массив аргументов, чего нет в вашем примере (в противном случае вы потерпите неудачу в первой строке с System.out.println()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...