API отражения Java и вызов метода с переменным числом аргументов - PullRequest
4 голосов
/ 31 октября 2011

У меня проблема при попытке разрешить ситуацию, когда я использую Java Reflection API для вызова метода, который принимает переменное число параметров.Каждый раз, когда я пытаюсь это сделать, я получаю «NoSuchMethodException».

Мое объявление метода для вызова:

public void AddShow(String movieName, String cinemaName, String... days) {
}

И код метода, который выполняет вызов:

public void Exec(String command){
    try {
        String[] words = command.split(" ");
        String commandName = words[0];
        Class<? extends UserInterface> thisClass = (Class<? extends UserInterface>)getClass();
        Class<String>[] par = new Class[words.length-1];
        String[] params = new String[words.length-1];
        for(int i = 1; i< words.length; i++){
            params[i-1] = words[i];
            try {
                par[i-1] = (Class<String>) Class.forName("java.lang.String");
            } catch (ClassNotFoundException e) {
                System.out.println("If this shows up, something is siriously wrong... Waht have you done?!");
            }
        }
        Method method;
        if(par.length != 0) {
            method = thisClass.getMethod(commandName, par);
            method.invoke(new UserInterface(CinemaDb), (Object[])params);
        } else {
            method = thisClass.getMethod(commandName);
            method.invoke(new UserInterface(CinemaDb));
        }
    } catch (SecurityException e) {
        System.out.println("Security error, sry again.");
    } catch (NoSuchMethodException e) {
        System.out.println("Wrong command, try again (check the parameters)!");
    } catch (IllegalAccessException e) {
        System.out.println("You don't have access rights, try again.");
    } catch (IllegalArgumentException e) {
        System.out.println("Wrong arguments, try again.");
    } catch (InvocationTargetException e) {
        System.out.println("Invocation error, try again.");
    }
}

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

Спасибо!

Ответы [ 3 ]

4 голосов
/ 31 октября 2011

varargs в Java реализуются через массивы, поэтому параметры String.class, String.class, and String[].class.

3 голосов
/ 31 октября 2011

Часть varargs представляется как String[] после компиляции, поэтому используйте String[].class

В вашем случае это будет немного сложнее, поскольку вы не можете точно знать, сколько аргументов существуетперед вараггами.Таким образом, если вы вызываете showFoo str1 str2 str3 str4, вы не можете знать, сколько строковых аргументов перед varargs.

Таким образом, вы можете поместить в вашу командную строку разделитель, который сообщит парсеру, куда добавить String[].class.Другой вариант - просто вызвать getMethods() и получить нужный метод только по его имени (повторять и сравнивать имена).Но вы не сможете использовать перегрузку.

Тем не менее, я не думаю, что было бы действительно хорошей идеей иметь такую ​​специально отформатированную строку для отражающих выполнений (если только она не поступает из внешней системы)., но тогда это может быть проблемой безопасности)

3 голосов
/ 31 октября 2011

У Object[], содержащего параметры, должно быть два String параметра и String[], вы проходите квартиру String[].

...