我可以将方法传递给Java中的另一个方法

时间:2010-11-27 01:33:47

标签: java methods

例如,我有以下方法调用:

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

Model.setTypes是List of Types的setter,我希望sendGet方法能够调用传递给它的任何方法,并且sendGet方法不能只调用Model.setTypes本身,因为它取决于在什么类型的Get请求正在执行。

感谢任何回复的人。

4 个答案:

答案 0 :(得分:7)

使用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()中访问。

答案 1 :(得分:4)

虽然很笨拙但有可能:您可以使用java.lang.reflect.Method指向某个方法并调用其invoke成员来调用它。

但是,几乎在所有情况下,这都不是您想要做的。相反,使用一个接口(即你的函数接受一个实现接口的特定类型的对象),或者你可以使用Runnable并调用它的run()函数,或{{1}并使用Callable

(感谢Crom指出call()

答案 2 :(得分:1)

Java没有first class functions:这是函数 - 除其他外 - 可以作为参数传递 - albeit there is a proposal。相反,这个问题通常用Java function objects来解决 - 通常是用单个函数实现接口的对象。一个例子是Collections API Comparator

因此,在您的情况下,使用单一方法(例如ModelSetter)定义接口(例如setTypes(List list))。定义Request.sentGet(ModelSetter modelSetter)

答案 3 :(得分: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();
    }
}

在上面的代码中,参数是: 对象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);
    }

}