1. 程式人生 > >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都用到回撥機制,可以訪問遠端伺服器程式。


    下面舉個通俗的例子:
    某天,我打電話向你請教問題,當然是個難題,^_^,你一時想不出解決方法,我又不能拿著電話在那裡傻等,於是我們約定:等你想出辦法後打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,我的手機響了,你興高采烈的說問題已經搞定,應該如此這般處理。故事到此結束。這個例子說明了“非同步+回撥”的程式設計模式。其中,你後來打手機告訴我結果便是一個“回撥”過程;我的手機號碼必須在以前告訴你,這便是註冊回撥函式;我的手機號碼應該有效並且手機能夠接收到你的呼叫,這是回撥函式必須符合介面規範。


    通過上面個人感覺到回撥更多的應用就是結合非同步。比如:Ajax中js通過元件和伺服器的非同步通訊。

例:

    程式設計師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根據我的定義編寫程式實現介面。
    public interface MyCallInterface  
    {  
        public void method();  
      
    }  
於是,程式設計師B只需要實現這個介面就能達到回撥的目的了:
    public class B implements MyCallInterface  
    {  
        public void method()  
        {  
           System.out.println("回撥"); 
        }  
      
        public static void main(String args[])  
        {  
           Caller call = new Caller();  
           call.setCallfuc(new B());  
           call.call();  
        }  
    }  
回撥函式:

1、利用 介面呼叫自己的方法,這個方法就是回撥函式(如上面的例子)
2、a呼叫b的方法,b再呼叫a的方法c,方法c對於a就是一個回撥函式。

相關推薦

java反射函式()

所謂回撥,就是客戶程式C呼叫服務程式S中的某個函式A,然後S又在某個時候反過來呼叫C中的某個函式B,對於C來說,這個B便叫做回撥函式。例如Win32下的視窗過程函式就是一個典型的回撥函式。一般說來,C不會自己呼叫B,C提供B的目的就是讓S來呼叫它,而且是C不得不提供。由於S

Lua 入門學習教程() 函式 函式

還記得開始學C語言的時候,書上就拿兩個數相加 作為例子,來介紹函式。我也拿 Add 來說吧。 函式的簡單寫法就像下面的Add local function Add( a,b ) -- body print(a+b) end Add(10,20) 然後面向物件 loca

【C/C++開發】函式指標函式

C++很多類庫都喜歡用回撥函式,MFC中的定時器,訊息機制,hook機制等待,包括現在在研究的cocos2d-x中也有很多的回撥函式。 1.回撥函式 什麼是回撥函式呢?回撥函式其實就是一個通過函式指標呼叫的函式!假如你把A函式的指標當作引數傳給B函式,然後在B函式中通過A函式傳進來的這個指標

【轉載】鉤子函式函式

在訊息處理機制中必不可少的一組CP,即回撥和鉤子。 鉤子的概念源於Windows的訊息處理機制,通過設定鉤子,應用程式可以對所有的訊息事件進行攔截,然後執行鉤子函式,對訊息進行想要的處理方式。 接下來是一段js程式碼,主要用於給btn設定點選的鉤子函式。 let btn = document.getEl

深入淺出剖析C語言函式指標函式(一)

關於靜態庫和動態庫的使用和製作方法。http://blog.csdn.net/morixinguan/article/details/52451612今天我們要搞明白的一個概念叫回調函式。什麼是回撥函式?百度的權威解釋如下:回撥函式就是一個通過函式指標呼叫的函式。如果你把函式

C#委託,事件函式

using System;using System.Collections.Generic;using System.Text;namespace TestApp{    ///<summary>/// 委託    ///</summary>///<param name="s1

Java設計模式-函式和觀察者模式

Android的框架中有非常多的地方使用了回撥的模式,例如Activity的生命週期,按鈕的點選事件等。 下面是回撥的基本模型: public class A { private CallBack callback; //註冊一個事件 public void reg

WebService、Ajax函式(一)

       本例項演示藉助WebService、Ajax技術和回撥函式,從MSSQL資料庫中獲取所需資料,並用JavaScript語言將資料結果顯示到網頁地圖上。 1、WebService        (1)在工具箱的Ajax Extentions下面找到ScriptM

詳解C#委託,事件函式

.Net程式設計中最經常用的元素,事件必然是其中之一。無論在ASP.NET還是WINFrom開發中,窗體載入(Load),繪製(Paint),初始化(Init)等等。“protected void Page_Load(object sender, EventArgs e)”這

java反射函式(一)

一、java的反射   反射的概念是由Smith在1982年首次提出的,主要是指程式可以訪問、檢測和修改它本身狀態或行為的一種能力。java語言在執行時擁有一項自觀的能力。    java反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一

Java JNA ()—— dll函式實現

java呼叫dll檔案需要使用回撥函式作為公開函式的引數時,用以下方法實現: 首先,看c++中定義的dll公開函式: typedef void (*ccback)(char *name ,int length); int dllFunction(char *ip, i

java在子執行緒主執行緒傳遞資料(函式

預習知識點: 什麼是回撥函式? 下面是知乎大神的回答,簡直不能再精闢 程式碼: package kun.thread; public class THread { static C c=new C(); //flag用來標誌子執行緒執行結束 stati

c的函式java中抽象函式,介面函式,抽象類簡單理解

先了解c語言的回撥函式,舉個簡單例項步步深入,比如A程式提供給B程式使用,但是A想要呼叫B的程式碼,這樣各自不同功能由B實現即可。 例項1A: extern int get_B_data(); void A_data_handle(){ printf("%d\n",get

Java—內部類()—實現閉包

前言: Java的閉包與回撥我也是第二次接觸這個概念,之前在自學Android的時候繪製View很多地方都用到了監聽器回撥,一直不是很明白,現在回頭鞏固Java的基礎總算的弄明白,儘量用我自己理解的語言來和大家分享,希望對不懂的朋友可以有一定的幫助,大神也可以

JAVA函式反射機制(原理不說直接看程式碼),補充動靜態代理

程式碼都是轉載或抄錄這個地址: http://blog.csdn.net/zhandoushi1982/article/details/8567709 http://blog.csdn.net/xiaanming/article/details/8703708/ 反射機制

java高階反射之獲取建構函式()

前提:Person類中有有參無參的建構函式,供測試用 package com.jk.fs; import java.lang.reflect.Constructor; /**  * 反射機制(獲取Class中的建構函式)  * @author sx123  

函式ros::spin()ros::spinOnce()

ROS的主迴圈中需要不斷呼叫ros::spin()或ros::spinOnce(),兩者區別在於前者呼叫後不會再返回,而後者在呼叫後還可以繼續執行之後的程式。 在使用ros::spin()的情況下,一般來說在初始化時已經設定好所有訊息的回撥,並且不需要其他背景程式執行。這樣一來,每次訊息到達時會執行使用者的

java函式詳解

宣告:部落格參考於https://www.cnblogs.com/yangmin86/p/7090882.html,謝謝哥們 回撥函式:是指在A類執行程式碼時,呼叫了B類中的方法,但B類中的方法執行了A類中的方法。 example: 1、Boss.java(Boss類中執行程式碼,呼叫了Emp類的doP

JavaScript使用函式

AJAX - onreadystatechange 事件 菜鳥教程地址http://www.runoob.com/ajax/ajax-xmlhttprequest-onreadystatechange.html/*不使用回撥函式*/<!DOCTYPE html&g

Qt 學習之路 2(19):事件的接受忽略(當重寫事件回撥函式時,時刻注意是否需要通過呼叫父類的同名函式來確保原有實現仍能進行!有好幾個例子。為什麼要這麼做?而不是自己去手動呼叫這兩個函式呢?因為我們無法確認父類中的這個處理函式有沒有額外的操作)

版本: 2012-09-29 2013-04-23 更新有關accept()和ignore()函式的相關內容。 2013-12-02 增加有關accept()和ignore()函式的示例。 上一章我們介紹了有關事件的相關內容。我們曾經提到,事件可以依情況接受和忽略。現在,我們就