1. 程式人生 > >java反射與函式回撥(一)

java反射與函式回撥(一)

一、java的反射

  反射的概念是由Smith在1982年首次提出的,主要是指程式可以訪問、檢測和修改它本身狀態或行為的一種能力。java語言在執行時擁有一項自觀的能力。


   java反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法;這種動態獲取資訊以及動態
   呼叫物件的方法的功能成為java語言的反射機制。

   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通過元件和伺服器的非同步通訊。


相關推薦

java反射函式()

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

java函式

以下是我根據自己的理解舉的一些偽例,簡單易懂,但實際上是通過介面設定回撥函式的。 比如: public class B(){ public void b(){ A a=n

js中的for迴圈非同步函式執行順序問題

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!                for(i=localStorage.length-1;i>=0;i--){//從後往前依次取每條localstorage local_key=local

Java非同步呼叫以及函式

非同步呼叫 在網上看了半天文章,現在對非同步呼叫的理解就是在一個程序執行的過程中,有一個執行很長時間的方法,這時候可以建立一個執行緒去非同步呼叫這個方法,然後在方法執行完成之後呼叫回撥函式告訴主程序他執行完了。 就比如說使用者在點選列表展示的時候,如果資料庫效率很慢我們不能讓瀏覽器一直處

Java基礎系列之內部類的多重繼承事件

為什要使用內部類實現多重繼承實現閉包(隱藏關鍵環節)事件回撥內部類的型別非靜態內部類public class NoStaticInsideClass { private @Setter String name; private @Setter i

java呼叫dll時函式的實現(jna)

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

初學Java,閉包和(二十)

閉包在Javascript中用的比較多,Java不顯式支援閉包,但對於非靜態內部類而言,它記錄了其外部類的詳細資訊,還保留了一個建立非靜態內部類物件的引用,並且可以直接呼叫外部類的private成員,因此可以把非靜態內部類當成面向物件領域的閉包。通過這種仿閉包的非靜態內部類,

Java再學習-簡單函式

   最近在研究Spring原始碼,其中有一個回撥函式的概念,一直出現,而且出現的頻率非常大,小編就查了好多資料,但是總是感覺不太實際,而且不容易理解,小編結合自己的事蹟,結合生活,做了這麼幾段程式碼

C#中的委託Java中的介面

  最近因為業務需求學習起了C#,對於學過Java的人來說,C#其實還是挺好懂的,基本上很多語法都是相通的。今天就談談我對C#和Java中不同的地方的理解吧。   說到Java中的介面回撥那麼就不得不提觀察者設計模式,所謂觀察者模式就是A(觀察者 Observ

java反射動態代理的理解

system 對象的訪問 讓我 integer 打破 類屬性 全部 列表 ces 一、什麽是反射機制?   反射的官方定義是這樣的:在運行狀態中,對於任意的一個類,都能夠知道這個類的所有屬性和方法,對任意一個對象都能夠通過反射機制調用一個類的任意方法,這種動態獲取類信息及動

Spring Bean生命週期——初始化(init-method)銷燬(destroy-method)

實現Bean初始化回撥和銷燬回撥各有三種方法,一是實現介面方法,二是在XML配置,三是使用註解 初始化回撥(init-method) 1、使用介面 org.springframework.beans.factory.InitializingBean介面類的作用是:在容器設定bean必

自定義Jquery函式函式

一:使用Jquery自定義函式 1、引入Jquery外掛    <script type="text/javascript" src="jquery-2.1.0.min.js"></script>   2、定義格式 開頭:(f

Go/函式/函式

## 回撥函式 package main import "fmt" type FuncType func (int,int) int //函式型別作為引數 func callBack(a,b int, f FuncType) (c int){ c = f(a,b) return }

JAVA反射 Android藍芽反射

  要想理解反射的原理,首先要了解什麼是型別資訊。Java讓我們在執行時識別物件和類的資訊,主要有2種方式:一種是傳統的RTTI,它假定我們在編譯時已經知道了所有的型別資訊;另一種是反射機制,它允許我們在執行時發現和使用類的資訊。 1、Class物件   理解RTTI在Java中的工作原

Java 反射機制詳解(

Java 反射機制詳解(一) 主要介紹以下幾方面內容 理解 Class 類 理解 Java 的類載入機制 學會使用 ClassLoader 進行類載入 理解反射的機制 掌握 Constructor、Method、Field 類的用法 理解並掌握動態代理&n

有關Java反射的使用看這篇就夠了

1. 簡介 本篇文章不探討反射的實現機制或者說實現原理,僅僅從使用的角度去講解我們常用的一些API介面,方便自己以後需要使用時信手拈來,同時也方便廣大博友能夠快速瞭解API的使用。 什麼是反射? 反射是java語言的一個特性,它允許一個java的類獲取他所有的成員變數

Java異常事物滾探究

轉自 http://www.linuxidc.com/Linux/2014-03/98885.htm spring 事務註解 預設遇到throw new RuntimeException("...");會回滾 需要捕獲的throw new Exception("...")

總結-全域性環境&執行流程&錯誤型別&垃圾回收機制&閉包&函式&函式

全域性環境&執行流程&錯誤型別&垃圾回收機制&閉包&函式&回撥函式 全域性環境 1.函式中的this表示改函式所屬的物件 2.window物件的成員在呼叫時可以省略window 執行流程 1.編譯程式碼:當前scr

java反射——建構函式

反射獲取建構函式並呼叫。說再多不入程式碼來的快。我把程式碼分成了一塊塊程式碼區,需要看一個註釋其他的就可以了,測試過都是可以的! package FanShe; import java.lang.reflect.*; class Student { //-------------

coco2d-x中成員函式實現原理

//標頭檔案 #ifndef __COOCS2D_CALLBACK_H__ #define __COOCS2D_CALLBACK_H__ #include <iostream> #include <string> using namespace std;