接口回調(diào)是指:可以把使用某一接口的類創(chuàng)建的對象的引用賦給該接口聲明的接口變量,那么該接口變量就可以調(diào)用被類實(shí)現(xiàn)的接口的方法。實(shí)際上,當(dāng)接口變量調(diào)用被類實(shí)現(xiàn)的接口中的方法時,就是通知相應(yīng)的對象調(diào)用接口的方法,這一過程稱為對象功能的接口回調(diào)。
成都創(chuàng)新互聯(lián)公司于2013年成立,先為拜泉等服務(wù)建站,拜泉等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為拜泉企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
示例代碼:
interface People{ //接口
void peopleList();
}
class Student implements People{ //接口實(shí)現(xiàn)類
public void peopleList(){ //實(shí)現(xiàn)接口方法
System.out.println("I'm a student.");
}
}
class Teacher implements People{ //接口實(shí)現(xiàn)類
public void peopleList(){ //實(shí)現(xiàn)接口方法
System.out.println("I'm a teacher.");
}
}
public class Example{
public static void main(String args[]){
People a; //聲明接口變量
a=new Student(); //實(shí)例化,接口變量中存放對象的引用
a.peopleList(); //接口回調(diào)
a=new Teacher(); //實(shí)例化,接口變量中存放對象的引用
a.peopleList(); //接口回調(diào)
}
}
輸出結(jié)果:
I’m a student.
I’m a teacher.
你好,我寫了個很簡單的代碼,你一看就明白了
public class A {
int value = 1001;
public A() {// A的構(gòu)造函數(shù),執(zhí)行B的exec()方法,里面又帶有對A的getValue()方法調(diào)用,這個就叫做回調(diào)
B b = new B(this);
b.exec();
}
public int getValue() {
return value;
}
public static void main(String[] args) {
new A();//構(gòu)造函數(shù)里已經(jīng)發(fā)生了回調(diào),所以不需要更多的代碼
}
}
class B {
private A a;
public B(A a) {
this.a = a;
}
public void exec() {
System.out.println(a.getValue());// 這里調(diào)用了a的getValue()方法
}
}
所謂回調(diào),就是客戶程序C調(diào)用服務(wù)程序S中的某個函數(shù)A,然后S又在某個時候反過來調(diào)用C中的某個函數(shù)B,對于C來說,這個B便叫做回調(diào)函數(shù)。
用DOM4J寫解析xml文檔的例子
如下:
SAXReader sax = new SAXReader();
String file = this.getServletContext().getRealPath("/xml/news.xml");//獲得xml文檔的路徑
Document doc = sax.read(file);
//獲得根元素坐標(biāo)
Element root = doc.getRootElement();
String value = "";
List nodes = root.selectNodes("http://new");
//得到元素個數(shù)
int size = nodes.size();
//定位到最后一個元素
Element el = (Element) nodes.get(size - 1);
//得到該元素所有屬性集合
Iterator it = el.attributeIterator();
//循環(huán)遍歷
while (it.hasNext()) {
//將集合中包含的元素轉(zhuǎn)換為Attribute類型
Attribute att = (Attribute) it.next();
//取出里面的數(shù)值
value = att.getValue();
}
這樣 所有的值就能都取出來了
不過 要導(dǎo)入這幾個包包
org.dom4j.*
org.dom4j.io.*
java.util.*
java.io.*
程序員A寫了一段程序(程序a),其中預(yù)留有回調(diào)函數(shù)接口,并封裝好了該程序。程序員B要讓a調(diào)用自己的程序b中的一個方法,于是,他通過a中的接口回調(diào)自己b中的方法。目的達(dá)到。在C/C++中,要用回調(diào)函數(shù),被掉函數(shù)需要告訴調(diào)用者自己的指針地址,但在JAVA中沒有指針,怎么辦?我們可以通過接口(interface)來實(shí)現(xiàn)定義回調(diào)函數(shù)。
假設(shè)我是程序員A,以下是我的程序a:
[java] view plaincopyprint?
public class Caller
{
public MyCallInterface mc;
public void setCallfuc(MyCallInterface mc)
{
this.mc= mc;
}
public void call(){
this.mc.method();
}
}
還需要定義一個接口,以便程序員B根據(jù)我的定義編寫程序?qū)崿F(xiàn)接口。
public interface MyCallInterface
{
public void method();
}
于是,程序員B只需要實(shí)現(xiàn)這個接口就能達(dá)到回調(diào)的目的了:
public class B implements MyCallInterface
{
public void method()
{
System.out.println("回調(diào)");
}
public static void main(String args[])
{
Caller call = new Caller();
call.setCallfuc(new B());
call.call();
}
}
簡單的你會寫,那就好辦,直接上代碼
public?interface?TestAPI?extends?StdCallLibrary?{
interface?LoginReply?extends?StdCallCallback?{
/**
*?登錄回調(diào)
*/
void?invoke(String?userId,?long?retCode,?String?retMsg);
}
/**
*?注冊一個登錄回調(diào)方法.此方法是dll提供的
*/
void?RegisterLoginReply(LoginReply?loginReply);
}
/**
*?實(shí)現(xiàn)登錄回調(diào)方法
*/
private?class?LoginReplyCallBack?implements?TestAPI.LoginReply?{
@Override
public?void?invoke(String?userId,?long?retCode,?String?retMsg)?{
log.info("登錄回調(diào)方法:{},{},{}",?userId,?retCode,?retMsg);
}
}
//?設(shè)置登錄回調(diào)
api.RegisterLoginReply(loginReplyCallBack);