免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1050 | 回复: 0
打印 上一主题 下一主题

java实现回调 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-02 16:21 |只看该作者 |倒序浏览
   熟悉MS-Windows和XWindowSystem事件驱动编程模型的开发人员,习惯于传递在某种事件发生时调用(即“回调”)的函数指针。Java的面向对象模型目前并不支持方法指针,这样似乎就不可能使用这种很好的机制。但我们并不是一点办法都没有!  
   Java的接口支持提供了一种获得回调的等价功能的机制。其技巧就是:定义一个简单接口,并在该接口中声明我们要调用的方法。  
例如,假定我们希望在某个事件发生时得到通知。我们可以定义一个接口:  
public interface InterestingEvent  
{  
    //这仅是一个常规方法。因此如果需要,  
    //它可有返回值,也可接收参数。  
    public void interestingEvent();  
}  
  这使得我们可以控制实现该接口的类的任何对象。因此,我们不必关心任何外部类型信息。与在将C++代码用于Motif时使用窗口小部件的数据域来容纳对象指针的难以控制的C函数相比,这种方法要好得多。  
发出事件信号的类必须等待实现了InterestingEvent接口的对象,并在适当时候调用interestingEvent()方法。  
public class EventNotifier  
{  
    private InterestingEvent ie;  
    private boolean somethingHappened;  
    public EventNotifier(InterestingEvent event)  
    {  
        //保存事件对象以备后用。  
        ie=event;  
        //还没有要报告的事件。  
        somethingHappened = false;  
    }  
    //...  
    publicvoiddoWork()  
    {  
    //检查在别处设置的谓词。  
        if(somethingHappened)  
        {  
        //通过调用接口的这个方法发出事件信号。  
            ie.interestingEvent();  
        }  
        //...  
    }  
    //...  
}

   在上例中,我使用somethingHappened谓词来跟踪是否应触发事件。在许多情况下,调用此方法足以保证向interestingEvent()发出信号。  
   希望接收事件通知的代码必须实现InterestingEvent接口,并将自身引用传递给事件通知程序。  
public class CallMe implements InterestingEvent  
{  
    private EventNotifier en;  
    public CallMe()  
    {  
    //创建事件通知程序,并将自身引用传递给它。  
        en = new EventNotifier(this);  
    }  
    //为事件定义实际的处理程序。  
    public void interestingEvent()  
    {  
    //噢!必定发生了感兴趣的事件!  
    //执行某些操作...  
    }  
    //...  
}
                                                  
(转载:http://www.cndw.com/tech/page/200602154379.asp?jdfwkey=49153)
补充--回调函数
Callback Function
  什么是回调函数?
  回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消
息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和
传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当
然,DLL编制者可以自己定义调用方式,但客户程序也必须遵守相同的规定。在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指
明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。
  理解回调函数!
  程序在调用一个函数(function)时(通常指api).相当于程序(program)呼叫(Call)了一个函数(function)关系表示如下:
  call(调用)
  program --------------------→ dll
  程序在调用一个函数时,将自己的函数的地址作为参数传递给程序调用的函数时(那么这个自己的函数称回调函数).需要回调函数的 DLL 函数往往是一些必须重复执行某些操作的函数.关系表示如下:
  call(调用)
  program --------------------→ dll
  ↑ ¦
  ¦_______________________________¦
  callback(回调)
  当你调用的函数在传递返回值给回调函数时,你就可以利用回调函数来处理或完成一定的操作。至于
如何定义自己的回调函数,跟具体使用的API函数有关,很多不同类别的回调函数有各种各样的参数,有关这些参数的描述一般在帮助中有说明回调函数的参数和
返回值等.其实简单说回调函数就是你所写的函数满足一定条件后,被DLL调用!
  也有这样的说法(比较容易理解):
  回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。为此,你需要做三件事:
  1. 声明;
  2. 定义;
  3. 设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于DLL调用。
(转载:http://baike.baidu.com/view/414773.htm)
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/65478/showart_1848800.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP