首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java中的回调函数

Java中的回调函数
EN

Stack Overflow用户
提问于 2009-01-14 16:40:16
回答 14查看 283.2K关注 0票数 196

有没有办法在Java方法中传递回调函数?

我试图模仿的行为是将.Net委托传递给函数。

我见过有人建议创建一个单独的对象,但这似乎有点过头了,但我意识到有时过度杀伤力是做事情的唯一方法。

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2009-01-14 16:48:13

如果你指的是像.NET匿名委托这样的东西,我想Java的匿名类也可以使用。

public class Main {

    public interface Visitor{
        int doJob(int a, int b);
    }


    public static void main(String[] args) {
        Visitor adder = new Visitor(){
            public int doJob(int a, int b) {
                return a + b;
            }
        };

        Visitor multiplier = new Visitor(){
            public int doJob(int a, int b) {
                return a*b;
            }
        };

        System.out.println(adder.doJob(10, 20));
        System.out.println(multiplier.doJob(10, 20));

    }
}
票数 171
EN

Stack Overflow用户

发布于 2017-04-04 03:27:03

在使用lambdas的Java8中,这非常容易。

public interface Callback {
    void callback();
}

public class Main {
    public static void main(String[] args) {
        methodThatExpectsACallback(() -> System.out.println("I am the callback."));
    }
    private static void methodThatExpectsACallback(Callback callback){
        System.out.println("I am the method.");
        callback.callback();
    }
}
票数 12
EN

Stack Overflow用户

发布于 2011-07-15 12:18:48

我发现使用reflect库实现的想法很有趣,并提出了这个想法,我认为它工作得很好。唯一的缺点是无法在编译时检查您是否传递了有效的参数。

public class CallBack {
    private String methodName;
    private Object scope;

    public CallBack(Object scope, String methodName) {
        this.methodName = methodName;
        this.scope = scope;
    }

    public Object invoke(Object... parameters) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
        Method method = scope.getClass().getMethod(methodName, getParameterClasses(parameters));
        return method.invoke(scope, parameters);
    }

    private Class[] getParameterClasses(Object... parameters) {
        Class[] classes = new Class[parameters.length];
        for (int i=0; i < classes.length; i++) {
            classes[i] = parameters[i].getClass();
        }
        return classes;
    }
}

您可以像这样使用它

public class CallBackTest {
    @Test
    public void testCallBack() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        TestClass testClass = new TestClass();
        CallBack callBack = new CallBack(testClass, "hello");
        callBack.invoke();
        callBack.invoke("Fred");
    }

    public class TestClass {
        public void hello() {
            System.out.println("Hello World");
        }

        public void hello(String name) {
            System.out.println("Hello " + name);
        }
    }
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/443708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档