下面演示一下java回调函数:
此处需要写3个类 ICallBack、Template、Test
ICallBack是一个接口,用来定义所要实现的方法,
package callBack;
public interface ICallBack {
void hello();
}
Template类持有ICallBack接口的引用,这样Template对象就可以调用实现了ICallBack接口的里的方法了:
package callBack;
public class Template {
public ICallBack callBack;
public void setICallBack(ICallBack callBack){
this.callBack = callBack;
}
public void doSth(){
this.callBack.hello();
}
}
再看看我们测试类Test:
package callBack;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Template foo = new Template();
foo.setICallBack(new ICallBack() {
@Override
public void hello() {//服务器回调此处的方法
System.out.println("你好,客户端!");
}
});
foo.doSth();//客户端去调用服务器的方法
}
}
当Test类执行foo.doSth()方法的时候,就是Template对像去执行接口(实现接口的类)中的方法,因为Test类中foo.setICallBack(new ICallBack() {.....实现了ICallback接口,并实现了其中的方法,所以,就成了回调。
就如同Hibernate中我们写分页的时候:
@Override
public List<Cost> findByPage(final int page,final int pageSize) throws DAOException {
return (List<Cost>) hibernateTemplate.execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException,
SQLException {
//FirstResult:从firstResult开始截取
// (page-1)*pageSize
return session.createQuery("from Cost").setFirstResult((page-1)*pageSize)
.setMaxResults(pageSize).list();
}
});
}
hibernateTemplatehibernateTemplatehibernateTemplatehibernateTemplatehibernateTmplate就相当于我写的Template类,HibernateCallBack是一个接口,相当于我写的ICallBack类,当然它的doInHibernate()方法就相当于我写的hello()方法了。
我就是这样对比这来理解的。