Java调用分为3种:同步调用,同步回调,异步回调
1.同步调用及平时常用的调用方式
2.回调在框架中使用较多,例如spring 的 AOP实现,servlet的拦截器实现
场景 老师布置完作业后提供一个回调方法,学生可以通过这个方法把执行情况汇报给自己的老师。
(回调使用的重点,不同的老师实现相同的回调接口,但是会有不同的实现,因此学生可以选择自己老师来进行汇报,这也是AOP通过反射调用相关方法的原理)
Java 模拟 : class A 实现一个接口 ,class B 调用接口 的方法 从而实现对class A 的调用
回调接口
public interface Callback {
public void taskResult(String name);
}
老师1实现回调接口
/**
* 学生必须知道老师的信息,才能回报任务情况,因此它必须实现回调接口
*
*/
public class Teacher1 implements Callback{
@Override
public void taskResult(String name) {
// TODO Auto-generated method stub
System.out.println(“任务:”+name+”完成”);
}
}
学生执行任务,并使用回调方法汇报给老师
public class Student {
Callback callback= null;
//将老师的联系信息给学生
public void setCallback(Callback callback)
{
this.callback=callback;
}
public void doTask()
{
for(int m=1;m<6;m++)
{
callback.taskResult(m+”是张三”);
}
}
}
测试类:
public class CallbackTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student student=new Student();
//指定学生对应的老师
student.setCallback(new Teacher1());
student.doTask();
}
}
可以看到学生在执行完任务后,会调用对应老师的回调方法
3.异步回调:异步回调会新建一个线程执行回调的同时继续进行接下来的任务
场景:小王要问小李一个问题,小李思考答案的同时小王继续做自己的事情,在小李得到答案后调用小王的回调方法,通知小王答案。(同样注意的是 不同的小王有不同的回调函数,会执行不同的操作)
回调函数接口:
public interface CallBack {
/**
* 这个是小李知道答案时要调用的函数告诉小王,也就是回调函数
* @param result 是答案
*/
public void solve(String result);
}
小王实现回调函数的类,小李在得到答案后会调用小王的回调方法通知小王:
/**
* 这个是小王
* @author xiaanming
* 实现了一个回调接口CallBack,相当于—–>背景一
*/
public class Wang implements CallBack {
/**
* 小李对象的引用
* 相当于—–>背景二
*/
private Li li;
/**
* 小王的构造方法,持有小李的引用
* @param li
*/
public Wang(Li li){
this.li = li;
}
/**
* 小王通过这个方法去问小李的问题
* @param question 就是小王要问的问题,1 + 1 = ?
*/
public void askQuestion(final String question){
//这里用一个线程就是异步,
new Thread(new Runnable() {
@Override
public void run() {
/**
* 小王调用小李中的方法,在这里注册回调接口
* 这就相当于A类调用B的方法C
*/
li.executeMessage(Wang.this, question);
}
}).start();
//小网问完问题挂掉电话就去干其他的事情了,诳街去了
play();
}
public void play(){
System.out.println(“我要逛街去了”);
}
/**
* 小李知道答案后调用此方法告诉小王,就是所谓的小王的回调方法
*/
@Override
public void solve(String result) {
System.out.println(“小李告诉小王的答案是—>” + result);
}
}
小李:
public class Li {
/**
* 相当于B类有参数为CallBack callBack的f()—->背景三
* @param callBack
* @param question 小王问的问题
*/
public void executeMessage(CallBack callBack, String question){
System.out.println(“小王问的问题—>” + question);
//模拟小李办自己的事情需要很长时间
for(int i=0; i<10000;i++){
}
/**
* 小李办完自己的事情之后想到了答案是2
*/
String result = “答案是2”;
/**
* 于是就打电话告诉小王,调用小王中的方法
* 这就相当于B类反过来调用A的方法D
*/
callBack.solve(result);
}
}
写一个测试类:
public class Test {
public static void main(String[] args) {
Li li = new Li();
Wang wang = new Wang(li);
wang.askQuestion(“1 + 1 = ?”);
}
}