Ⅰ 在java里 什么是回调函数啊.
C语言中回调函数解释:
回调函数(Callback Function)是怎样一种函数呢?
函数是用来被调用的,我们调用函数的方法有两种:
l 直接调用:在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行。这里,A称为“主叫函数”(Caller),B称为“被叫函数”(Callee)。
l 间接调用:在函数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中,通常就是编写另外一个类或类库的人(李四)规定一个接口,然后你(张三)来实现这个接口,然后把这个实现类的一个对象作为参数传给别人的程序,别人的程序必要时就会通过那个接口来调用你编写的函数。”
Ⅱ JAVA 匿名内部类和回调函数
new Inner()后面的一对花括号,表示的是匿名内部类,此类的父类显然是Object,实现接口Inner。
Inner是接口,接口和抽象类都是不能直接实例化的,也就是说
Inner in = new Inner();这样写是不能通过编译的,不过java的语法支持就地使用一个匿名类来实现所有的抽象方法(接口的所有方法声明和抽象类的所有抽象方法)
Ⅲ 请问什么叫java中的回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数版传递给另一个函权数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
Ⅳ java怎么实现c的回调函数
以我的理解恐怕这个CALLBACK要让你失望了~~JAVA的操作机制是隐藏了指针和引用,地址的操作在JAVA里面是不允许的~~所以JNI接口中定义的方法,不能使用函数指针作为形参,所以这个回调函数在JAVA的CLASS中是不能调用的;
你换个思考角度用TCP/UDP程序吧,JAVA的CLASS调用的结果通过流传递给C/C++的Server。。。貌似我只能想到这样了。
望采纳!!
Ⅳ java用jna调用C语言dll接口中的回调函数怎么写
简单的你会写,那就好办,直接上代码
{
{
/**
*登录回调
*/
voidinvoke(StringuserId,longretCode,StringretMsg);
}
/**
*注册一个登录回调方法.此方法是dll提供的
*/
voidRegisterLoginReply(LoginReplyloginReply);
}
/**
*实现登录回调方法
*/
.LoginReply{
@Override
publicvoidinvoke(StringuserId,longretCode,StringretMsg){
log.info("登录回调方法:{},{},{}",userId,retCode,retMsg);
}
}
//设置登录回调
api.RegisterLoginReply(loginReplyCallBack);
Ⅵ java中怎么使用callback函数
在很多场景,作为开发都会想到,在执行完毕一个任务的时候,能执行一个callback函数是多么好的事情。
现在模拟一下这个情景:
定义三个类。分别是主函数类。callback函数的接口类。业务处理类。在业务处理类中,处理完业务之后,执行一个callback函数。
[java] view plain
package comz;
public class Main {
public static void main(String[] args) {
new TestCallBack().compute(1000, new ComputeCallBack() {
@Override
public void onComputeEnd() {
System.out.println("end back!!!");
}
});
}
}
这是主函数类。new了一个业务处理类来处理逻辑,并在处理完毕之后,执行callback函数。
[java] view plain
package comz;
public class TestCallBack {
public void compute(int n, ComputeCallBack callback) {
for (int i = 0; i < n; i++) {
System.out.println(i);
}
callback.onComputeEnd();
}
}
这是业务处理类。仅仅输出一些数字,然后执行回调函数。
[java] view plain
package comz;
public interface ComputeCallBack {
public void onComputeEnd();
}
这是回调函数的接口。
--------------------------------------
运行上面的代码,就会在输出结束的时候调用在Main里面的callback函数,输出System.out.println("end back!!!");
--------------------------------------
这里的原理是:
在主类中,新建业务类的时候,传递进去的第二个参数是一个实现了回调接口的匿名类对象。
在业务类中,我们调用了这个对象的onComputeEnd方法。在执行onComputeEnd的时候,jvm会找到这个对象的函数实现并调用。于是就输出了end back!!!