Как я могу вызвать метод, у которого есть метод в качестве аргумента? - PullRequest
1 голос
/ 31 мая 2011

Вот фрагмент кода, который у меня есть: (что я пытаюсь сделать с ним: определить метод "renamingrule" в моем основном классе, создать экземпляр экземпляра моего другого класса "renamescript" и вызвать его метод переименования, передавв качестве параметра метода "renamingrule" я определил в основном классе. В классе RenamScript все хорошо, ошибок нет, но я не знаю, как вызвать метод переименования класса сценария из моего основного класса / метода. спасибо)

public class RenameScript2 {

    ...

    public void rename(Method methodToCall) throws IOException, IllegalAccessException, InvocationTargetException {


    try
    {
        ...

            String command = "cmd /c rename "+_path+"\\"+"\""+next_file+"\" "
                    +"\""+methodToCall.invoke(next_file, next_index)+"\"";
            p = Runtime.getRuntime().exec(command);

    }catch(IOException e1) {} catch(IllegalAccessException IA1) {}  catch(InvocationTargetException IT1) {} ;


    }//end of rename


} //end of class
//=======================================

public class RenameScriptMain2 {

    public static String RenamingRule(String input, int file_row)
    {
        String output = "renamed file "+(file_row+1)+".mp3";
        return output;
    }

    public static void main(String[] args) throws IOException
    {
        RenameScript2 renamer = new RenameScript2();
        renamer.setPath("c:\\users\\roise\\documents\\netbeansprojects\\temp\\files");
        try{
            renamer.rename(RenamingRule);
        }catch(IOException e2) {};

        System.out.println("Done from main()\n\n");

    }
} //end of class

Ответы [ 3 ]

5 голосов
/ 31 мая 2011

Вы получаете объект Method с помощью метода Class.getMethod. Примерно так:

RenameScript2.class.getMethod("rename", parameters);

Однако я предлагаю вам рассмотреть возможность написания интерфейса для класса, который может выполнять переименование, вместо передачи Method.

Такой интерфейс может выглядеть как

interface RenameAction {
    void performRename();
}

Чтобы обернуть скрипт в RenameAction объект, вы должны сделать что-то вроде

RenameAction action = new RenameAction() {
    void performRename() {
        // ...
        String command = "cmd /c rename "+_path+"\\"+"\""+next_file+"\" "...
        p = Runtime.getRuntime().exec(command);
        // ...
    }
};

Тогда вы бы просто сделали так:

public void rename(RenameAction action) {
    action.performRename();
}
0 голосов
/ 31 мая 2011

Вот как вы должны сделать:

  1. Сделать класс RenameScript2 абстрактным, добавив абстрактный метод public static String RenamingRule(String input, int file_row)
  2. Затем ваш основной класс RenameScriptMain2 расширяется над классом RenameScript2 и обеспечивает реализацию метода RenamingRule().
  3. Теперь внутри main метода создайте экземпляр класса RenameScriptMain2 и вызовите метод RenamingRule()
0 голосов
/ 31 мая 2011

Во-первых, aioobe определенно корректен, передача объекта Method немного уродлива.Я предполагаю, что вы застряли с этим!

Чтобы получить метод, вам нужно будет использовать отражение .Приведенный ниже код захватывает метод с именем toString в классе Integer.Затем он вызывает метод toString.

Method method = Integer.class.getMethod("toString");
Object o = method.invoke(new Integer(7));
System.out.println(o);

Статическим методам не нужно передавать первый параметр в method.invoke

Method method = File.class.getMethod("listRoots");
System.out.println(method.invoke(null));

Это показывает причину, по которой вы не должныне используй это.Эта строка "toString" и "listRoots" не подлежит рефакторингу.Если кто-то переименует метод, вместо ошибки во время компиляции вы получите исключение времени выполнения (отсюда и исключения, которые вам нужно перехватить, NoSuchMethodException и IllegalAccessException).Также гораздо медленнее использовать отражение, чем обычный код.

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