Java 回调函数详解及使用

 更新时间:2017年03月02日 14:31:24   作者:天才哆啦梦  
这篇文章主要介绍了Java 回调函数详解及使用,附有简单实例,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

Java 回调函数详解

前言:

C语言中回调函数解释:

回调函数(Callback Function)是怎样一种函数呢?
函数是用来被调用的,我们调用函数的方法有两种:

         直接调用:在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行。这里,A称为“主叫函数”(Caller),B称为“被叫函数”(Callee)。

         间接调用:在函数A的函数体里并不出现函数B的函数名,而是使用指向函数B的函数指针p来使内存中属于函数B的代码片断得以执行——听起来很酷,是吧。

比起直接调用来,间接调用的确麻烦,那为什么还要使用间接调用呢?原因很简单——直接调用把函数名都写进函数体了,经过编译器那么一编译,板上钉钉,A注定调用的是B了,这样的程序只能按照程序员事先设计好的流程执行下去,太呆板了。此时,间接调用的巨大灵活性就显现出来了。想一想,如果p是函数A的一个参数(参数是变量,是变量就可以变吗!),那么程序的最终用户完全可以通过操作来改变p的指向——这样,A在通过p调用函数的时候就有机会调用到不同的函数,这样程序的实用性和扩展性就强多了。

   在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就称为回调。在调用接口时,需要严格的按照定义的参数和方法调用,并且需要处理函数的异步,否则会导致程序的崩溃。这样的解释似乎还是比较难懂,这里举个简单的例子,程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。目的达到。在C/C++中,要用回调函数,被掉函数需要告诉调用者自己的指针地址,但在JAVA中没有指针,怎么办?我们可以通过接口(interface)来实现定义回调函数。

  正常情况下开发人员使用已经定义好的API,这个过程叫Call。但是有时这样不能满足需求,就需要程序员注册自己的程序,然后让事先定义好多API在合适的时候调用注册的方法,这叫CallBack。

“通常大家说的回调函数一般就是按照别人(李四)的定好的接口规范写,等待别人(张三)调用的函数,在C语言中,回调函数通常通过函数指针来传递;在Java中,通常就是编写另外一个类或类库的人(李四)规定一个接口,然后你(张三)来实现这个接口,然后把这个实现类的一个对象作为参数传给别人的程序,别人的程序必要时就会通过那个接口来调用你编写的函数。”

    使用技巧:定一个接口,在接口中声明我们想调用的方法。

                    在另一个方法中注册刚定义的回调接口

第一步:定义回调接口

package com.callback;
 
/**
 *
 @since 2012-02-02
 *
 @desc 定义回调接口
 */
public interface CallBackInterface
 {
 
  public void doSome(); 
   
  public void exectueMethod();
}

第二步:李四编写的程序

package com.callback;
 
/**
 *
 @since 2012-02-02
 *
 @desc 李四
 */
public class MethodB
 {
 
  public double getTime(CallBackInterface
 callBack) {
    long start
 = System.currentTimeMillis();
    callBack.exectueMethod();
    long end
 = System.currentTimeMillis();
    System.out.println("cost
 time=" +
 (end - start));
    return end
 - start;
  }
}

  第三步:张三实现李四规定的接口

package com.callback;
 
/**
 *
 @since 2012-02-02
 *
 @desc 张三
 */
public class MethodA
 {
 
  public static void main(String
 args[]){
    MethodB
 b=new MethodB();
    //返回值d只和MethodB有关,和接口中方法的返回值无关
    double d=b.getTime(new CallBackInterface()
 {
       
      //张三实现了李四定义的接口
      public void exectueMethod()
 {
        new MethodA().testMethod();
      }
       
      @Override
      public void doSome()
 {
         
      }
    });
    System.out.println("d="+d);
  }
   
  public void testMethod(){
    for(int i=0;i<10000;i++){
      System.out.print("");
    }
  }
}

  输出结果:

cost time=31
d=31.0

理解“回调函数”

所谓回调,就是客户程序CLIENT调用服务程序SERVER中的某个函数SA,然后SERVER又在某个时候反过来调用CLIENT中的某个函数CB,对于CLIENT来说,这个CB便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。

一般说来,CLIENT不会自己调用CB,CLIENT提供CB的目的就是让SERVER来调用它,而且是CLIENT不得不提供。由于SERVER并不知道CLIENT提供的CB叫甚名谁,所以SERVER会约定CB的接口规范(函数原型),然后由CLIENT提前通过SERVER的一个函数R告诉SERVER自己将要使用CB函数,这个过程称为回调函数的注册,R称为注册函数。Web SERVERerviCliente以及Java的RMI都用到回调机制,可以访问远程服务器程序。

下面举个通俗的例子:

某天,我打电话向你请教问题,当然是个难题,:),你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
通过上面个人感觉到回调函数更多的应用就是结合异步。比如:ajax中jServer通过组件和服务器的异步通信。

什么是回调函数

精妙比喻:回调函数还真有点像您随身带的BP机:告诉别人号码,在它有事情时Call您

回调用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调,例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层的处理工作外,还将进行回调,将这个数据交给上层应用层来做进一步处理,这在分层的数据通信中很普遍。

其实回调和API非常接近,他们的共性都是跨层调用的函数。但区别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;而回调正好相反,他是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装,这个安装函数其实就是一个低层提供的API,安装后低层不知道这个回调的名字,但它通过一个函数指针来保存这个回调,在需要调用时,只需引用这个函数指针和相关的参数指针。

其实:回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • SpringBoot之bootstrap和application的区别解读

    SpringBoot之bootstrap和application的区别解读

    这篇文章主要介绍了SpringBoot之bootstrap和application的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • SpringBoot外部化配置示例解析

    SpringBoot外部化配置示例解析

    这篇文章主要介绍了SpringBoot外部化配置示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java利用反射如何查找使用指定注解的类详解

    Java利用反射如何查找使用指定注解的类详解

    这篇文章主要给大家介绍了关于Java利用反射如何查找使用指定注解的类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • WIN7系统JavaEE(tomcat7 Eclipse)环境配置教程(二)

    WIN7系统JavaEE(tomcat7 Eclipse)环境配置教程(二)

    这篇文章主要介绍了WIN7系统JavaEE(java+tomcat7+Eclipse)环境配置教程,本文重点在于tomcat配置、Eclipse配置,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • 基数排序简介及Java语言实现

    基数排序简介及Java语言实现

    这篇文章主要介绍了基数排序简介及Java语言实现,涉及基数排序的基本思想简单介绍和桶排序的分析,以及基数排序的Java实现,具有一定借鉴价值,需要的朋友可以参考下。
    2017-11-11
  • javaweb 项目初始配置的方法步骤

    javaweb 项目初始配置的方法步骤

    本文主要介绍了javaweb 项目初始配置的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Spring和IDEA不推荐使用@Autowired?注解原因解析

    Spring和IDEA不推荐使用@Autowired?注解原因解析

    这篇文章主要为大家介绍了Spring和IDEA不推荐使用@Autowired?注解原因解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • javassist使用指南

    javassist使用指南

    这篇文章主要介绍了javassist的使用方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • IDEA?下?Gradle?删除多余无用依赖的处理方法

    IDEA?下?Gradle?删除多余无用依赖的处理方法

    这篇文章主要介绍了IDEA下Gradle删除多余无用依赖,使用该插件可以一定程度上帮助我们删除无用依赖,但是也可能会多删除有用的依赖,需要在使用插件自动修复后手动检测项目,验证是否会出现问题,避免导致上线发布错误的负优化
    2022-03-03
  • SpringBoot整合MinIO实现文件存储系统的代码示例

    SpringBoot整合MinIO实现文件存储系统的代码示例

    在现代的应用程序中,文件存储和管理是一个常见的需求,MinIO是一个开源的对象存储系统,与Spring?Boot框架结合使用,可以快速构建高性能的文件存储系统,本文将介绍如何使用Spring?Boot和MinIO来实现文件存储系统
    2023-06-06

最新评论

?


http://www.vxiaotou.com