2010-11-27 2 views
2

Например, у меня есть метод, следующий вызов:Могу ли я передать метод в другой метод в Java

Requests.sendGet("/type", Model.setTypes); 

Model.setTypes является примером для списка типов, я хочу, чтобы метод sendGet, чтобы иметь возможность вызов любого метода, переданного в него, и метод sendGet не может просто вызвать сам Model.setTypes, потому что он зависит от того, какой тип запроса Get выполняется.

Спасибо всем, кто отвечает.

ответ

4

Возможно, хотя неуклюже: вы можете использовать java.lang.reflect.Method, чтобы указать на способ и позвонить его члену invoke, чтобы позвонить ему.

Однако почти во всех случаях это не то, что вы хотите сделать. Вместо этого используйте для этого интерфейс (т. Е. Ваша функция принимает объект определенного типа, который реализует интерфейс), или вы можете взять Runnable и вызвать функцию run() или Callable и использовать call().

(Спасибо Крома за указание Callable)

+1

Вызываемый может быть лучшим выбором, чем Runnable. – CromTheDestroyer 2010-11-27 02:27:28

1

Java не first class functions: то есть функции - среди прочего - проходимый в качестве аргументов - albeit there is a proposal. Вместо этого эта проблема обычно решается на Java с помощью function objects - обычно объектов, реализующих интерфейс с одной функцией. Примером может служить API коллекций Comparator.

Таким образом, в вашей ситуации определите интерфейс (например, ModelSetter) одним способом (например, setTypes(List list)). Определить Request.sentGet(ModelSetter modelSetter).

6

Используйте command pattern.

public interface Command { 
    public void execute(); 
} 

public class Requests { 
    public static void sendGet(String url, Command command) { 
     // Do your stuff here and then execute the command. 
     command.execute(); 
    } 
} 

final Model model = getItSomehow(); // Must be declared final. 
Requests.sendGet("/type", new Command() { 
    public void execute() { 
     model.setType(); 
    } 
}); 

Вы можете при необходимости добавить аргумент execute() метод, как RequestEvent, который может быть создан Requests#sendGet() и доступ в Command#execute().

0
public void invokeAMethod(Object o, String methodName, String...params){ 
    try{ 
    Class<?> driverClass = o.getClass(); 
    Method[] driverMethod = driverClass.getMethods(); 
    for(Method m : driverMethod) { 
     if(m.getName().equalsIgnoreCase(methodName)) { 
      if(m.isVarArgs()) { 
       Object[] obj = new Object[params.length]; 
       for(int i=0;i<params.length;i++) { 
        obj[i] = params[i]; 
       } 
       m.invoke(new Object[]{obj}); 
      } 
      else 
       m.invoke(o,params); 
     } 
    } 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

В приведенном выше коде, параметры: Объект О: Объект класса, в котором ваш вызова метода принадлежит Строка имяМетода: имя метода, который вы хотите позвонить. String ... params: параметры метода, который вы хотите вызвать.

public class Sample{ 

    public static void main(String[] args){ 
     method2("method1") 
    } 

    public void method1(){ 
     System.out.println("method1"); 
    } 

    public static void method2(String methodName){ 
     invokeAMethod(this,method1); 
    } 

}