代码之家  ›  专栏  ›  技术社区  ›  adhanlon

我能用Java把一个方法传给另一个方法吗

  •  2
  • adhanlon  · 技术社区  · 15 年前

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

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

    setTypes是一个类型列表的setter,我希望sendGet方法能够调用传入它的任何方法,sendGet方法不能只调用Model.setTypes本身,因为它取决于执行的Get请求的类型。

    感谢所有回复的人。

    4 回复  |  直到 15 年前
        1
  •  4
  •   EboMike    15 年前

    这是可能的,虽然笨拙:你可以使用 java.lang.reflect.Method 指向方法并调用其 invoke 成员调用它。

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

    (感谢克罗姆指出 可赎回 )

        2
  •  7
  •   BalusC    15 年前

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

        3
  •  1
  •   orangepips 111111    15 年前

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

    所以在你的情况下定义一个接口(例如。 ModelSetter )使用单一方法(例如。 setTypes(List list) ). 定义 Request.sentGet(ModelSetter modelSetter) .

        4
  •  0
  •   Pedro del Sol    9 年前
    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 method name:要调用的方法的名称。 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);
        }
    
    }