java回调函数实例(Struts2源码)

    技术2022-05-20  49

    首先举例说明什么是回调函数,程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。目的达到。在struts2的源码中就有这样的例子:

    com.opensymphony.xwork2.inject.ContainerImpl中有如下方法

    <T> T callInContext(ContextualCallable<T> callable) { Object[] reference = localContext.get(); if (reference[0] == null) { reference[0] = new InternalContext(this); try { return callable.call((InternalContext)reference[0]); } finally { // Only remove the context if this call created it. reference[0] = null; } } else { // Someone else will clean up this context. return callable.call((InternalContext)reference[0]); } }

    此外还有这个回调接口:

    interface ContextualCallable<T> { T call(InternalContext context); }

    以下是在注入方法中进行了调用:

    public void inject(final Object o) { callInContext(new ContextualCallable<Void>() { public Void call(InternalContext context) { inject(o, context); return null; } }); }

    从以上代码中可以看到,在new ContextualCallable接口的实例进行传参后,我们可以在接口提供的call方法中写一些处理的代码,而这段代码会主调方法callInContext来进行回调。这样就达到了扩展性的目的,callInContext方法是事先写好的代码,但是其中可动态插入调入者的代码逻辑。


    最新回复(0)