Могу ли я передать метод в другой метод в Java - PullRequest
2 голосов
/ 27 ноября 2010

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 27 ноября 2010

Используйте шаблон команды .

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().

4 голосов
/ 27 ноября 2010

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

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

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

1 голос
/ 27 ноября 2010

Java не имеет функций первого класса : то есть функции - среди прочего - передаваемые в качестве аргументов - хотя есть предложение .Вместо этого эта проблема обычно решается в Java с объектами функций - обычно объектами, которые реализуют интерфейс с одной функцией.Примером может служить API коллекций Comparator .

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

0 голосов
/ 10 июля 2017
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();
    }
}

В приведенном выше коде параметры: Object o: Объект класса, к которому принадлежит ваш вызывающий метод String methodName: имя метода, который вы хотите вызвать. 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);
    }

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