java回调的实例介绍



java回调,什么是回调函数。简单地形容:客户程序C调用服务程序S中的一个函数A,接着S又在某个时反过来调用C中的函数B,对于C这个B便叫做回调函数。举个形象点的例子:Win32的窗口过程函数就是回调函数。通常C不会自己调用B,C提供B函数就是让S来调用,另外是C一定要提供。因为S不清楚C提供的B名字,因此S会规定B的接口规范(函数原型),由C提前通过S的一个函数R来告诉S自己要使用B函数,该过程叫做回调函数的注册,R称为注册函数。Web Service以及Java的RMI都用到回调机制,可以访问远程服务器程序。

以下是通俗的例子:
某天,我打电话向你请教问题,但是你不能马上想出解决问题的方法,我又不能在电话里等你,于是就说好:你想出办法后打手机告诉我,而我就挂掉电话做别的事情了。过了若干时间,我手机响了,你说问题已经解决,应该如此这般处理。该例子说明了“异步+回调”的编程模式。其实,你打手机告诉我问题的解决方法便是一个“回调”过程;我的手机号码必须在以前告诉你,这就是注册回调函数;手机号码应该有效而且可以接收到你的呼叫,也就是说回调函数必须符合接口规范。

回调的应用经常要结合异步。例如:Ajax中js通过组件和服务器的异步通信。

java回调举例:
程序员A写了程序a,预留有回调函数接口,封装好了该程序。程序员B要a调用他的程序b中的某个方法,他通过a中的接口回调自己b中的方法。C/C++中,要用回调函数,被掉函数需要告诉调用者自己的指针地址,而JAVA没有指针怎么办?可以通过接口(interface)来实现定义回调函数。
如果我是程序员A,以下是我的程序a:

public class Caller

{
public MyCallInterface mc;


public void setCallfuc(MyCallInterface mc)
{
this.mc= mc;
}

public void call(){
this.mc.method();
}
}

还需要定义一个接口,便于程序员B根据我的定义编写程序实现接口。

  1. public interface MyCallInterface
  2. {
  3.     public void method();
  4. }

 

程序员B只需要实现这个接口就能达到回调的目的了:

  1. public class B implements MyCallInterface
  2. {
  3.     public void method()
  4.     {
  5.        System.out.println(“回调”);
  6.     }
  7.     public static void main(String args[])
  8.     {
  9.        Caller call = new Caller();
  10.        call.setCallfuc(new B());
  11.        call.call();
  12.     }
  13. }