怎样理解java中的回调函数

问题描述

最近遇到回调函数问题,有点不太理解,到底什么是回调函数,有何用途,与命令模式是不是有点关系!

解决方案

是可以这样说的·这个在spring中尤其明显,比如spring中的运用到的AOP2.0以后的框架,在spring配置文件中引入aop2.0以后的命名空间后可以这样配置:<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"><bean id="actor" class="aop.v2.first.Actor"/><bean id="audience" class="aop.v2.first.Audience"></bean><bean id="log" class="aop.v2.first.Log"></bean><bean id="time" class="aop.v2.first.Time"></bean><aop:config><aop:pointcut id="pc" expression="within(aop.v2.first.Actor)"/><aop:pointcut id="logpc" expression="within(aop.v2.first.Actor) or within(aop.v2.first.Audience)"/><aop:pointcut id="pc1" expression="within(aop.v2.first.Actor) and args(aa,bb)"/><aop:aspect ref="audience"><aop:before method="takeseat" pointcut-ref="pc" /><aop:after-returning method="applaud" pointcut-ref="pc"/><aop:after-throwing method="protest" pointcut-ref="pc"/></aop:aspect><aop:aspect ref="log"><aop:before method="before" pointcut-ref="pc"/><aop:after-returning returning="res" method="afterReturning" pointcut-ref="pc"/><aop:after-throwing throwing="e" method="afterThrowing" pointcut-ref="pc"/><aop:after-throwing throwing="e" method="throwsLog" pointcut-ref="pc"/><aop:before method="logArgs" pointcut-ref="pc1"/></aop:aspect><aop:aspect ref="time"><aop:around method="around" pointcut-ref="logpc"/></aop:aspect></aop:config></beans>其中<aop:after>:等价于try-catch-finally中的finally,只要方法执行一定会执行after对应的方法<aop:around>:允许多线程并发访问,Object *(ProceedingJoinPoint jp)throws Throwable{}返回值必须是Object,方法参数必须是ProceedingJoinPoint,必须抛出Throwable,三者缺一不可,JP指被拦截的目标方法(spring只支持方法)相关信息<aop:after-returning>:返回值之后执行的方法<aop:after-throwing>:抛出异常之后执行的方法<aop:before>:在调用方法之前执行的代码这些标签对应的method属性的值就是对应定义的切面中的方法,可以在特定的情况下执行这些方法。注意以上五个时机其实只有around是一个拦截器,他可以决定方法是否执行,其他的四种时机其实确切来说只是一个回调函数而已,除了抛出异常,否则不能终止程序的运行总得来说,回调函数就是基本的业务逻辑处理完毕之后,想增加一下额外的功能(日志的记录)或者检测(是否有异常抛出)等功能,然后程序执行的一个或多个方法

时间: 2024-11-01 19:20:55

怎样理解java中的回调函数的相关文章

理解javascript中的回调函数(callback)_javascript技巧

最近在看 express,满眼看去,到处是以函数作为参数的回调函数的使用.如果这个概念理解不了,nodejs.express 的代码就会看得一塌糊涂.比如: 复制代码 代码如下: app.use(function(req, res, next) {     var err = new Error('Not Found');     err.status = 404;     next(err); }); app是对象,use是方法,方法的参数是一个带参的匿名函数,函数体直接在后面给出了.这段代码

如何理解java中的空实现

问题描述 如何理解java中的空实现 新建一个类实现某接口,然后这个类的构造方法重写接口的某个方法,这个方法没有方法体 也就是重写其抽象方法,那么这样是不是控实现呢 解决方案 没有空实现这个概念,只有抽象类中的抽象函数,和接口中的函数定义,它们只有函数定义. 有的时候,对于void类型的函数,我们只打上括号,没有任何代码,这通常被称为空实现,或者桩函数. 解决方案二: java 中的空指针,不为空,的理解CallBack 的理解和java实现对java 接口和实现的理解 解决方案三: java高

线程中的回调函数如何获得返回值,请高手开悟,在线等......

问题描述 普通回调方法:classA{classBxx=newclassB();stringss=k.ca(tm);stringtm(stringxm){returnxm+"一杯醉倒";}}classB{publicdelegatestringtc();publicstringca(tcmm){MessageBox.Show("到这里了!");returnmm("我");}}执行stringss=k.ca(tm);语句后,得到回调函数tm的返回值

java编程思想-如何更好的理解java中的面向对象

问题描述 如何更好的理解java中的面向对象 现在学到java的面向对象,有时候会把很多知识点弄混乱,怎么样才能把面向对象的知识点梳理好啊 解决方案 万物皆对象!!!你可以这样理解,面向对象的思想主要是让我们程序员更好的理解编程,因为和机器交流语法比较难懂,所有为了让编程更简单人们就提出了面向对象的思想.就是我们将任何一个东西都可以想象成一个有血有肉的.比如一本书.我们可以知道书可以有书名,可以页数,可以有类容等等这就是我们所说的属性,书可能还有翻页等这些动作这就相当于方法(有些语言叫做函数)了

理解java中的深复制和浅复制_java

 Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念.并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象.本文会让你了解什么是影子clone与深度clone,认识它们的区别.优点及缺点.       看到这个标题,是不是有点困惑:Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写

全面理解java中的异常处理机制_java

一.java异常总结: 异常就是程序运行时出现不正常运行情况 1.异常由来: 通过java的类的形式对现实事物中问题的描述,并封住成了对象 其实就是java对不正常情况描述后的对象体现 2.对于问题的划分有两种:一种是严重的问题,一种是非严重的问题 对于严重的,java通过Error类来描述 对于Error一般不编写针对性的代码对其进行处理 对于非严重的,java通过Exception类来描述 对于Exception可以使用针对性的处理方式进行处理 3.常见的异常有:数组角标越界异常,空指针异常

如何理解java中 对象.this方法 还有 类.this.方法的 意义

问题描述 如何理解java中 对象.this方法 还有 类.this.方法的 意义 如何理解java中 对象.this方法 还有 类.this.方法的 意义 有没有这两种语法规则呢 解决方案 this.方法是在某个对象的实例方法内,this代表当前实例.一般情况下不用写,除非它和参数重名才需要: class A { int a; int b; public void seta(int a) { this.a = a; //因为参数a和成员变量a都叫a,所以需要区分. b = a; //相当于th

如何理解java中的某些方法不是线程安全的(不能同步访问)。

问题描述 如何理解java中的某些方法不是线程安全的(不能同步访问). 如何理解java中的某些方法不是线程安全的(不能同步访问). 能同步访问的方法有哪些,如何判断一个方法能不能同步访问 解决方案 不是线程安全的(不能同步访问) 你说反了.不是线程安全的才需要同步访问.同步访问的意思就是串行执行,等前面执行完了,再执行后面的. 线程不安全的场合很多,比如像操作系统中的用户界面.打印机等外设.控制台输出,都不允许并发(设想两个程序同时要输出文字到同一个屏幕,那还不乱套了) 在代码中,每个线程有自

cocos2d中关于回调函数的pSender参数的问题

问题描述 cocos2d中关于回调函数的pSender参数的问题 10C 运行结果显示,CallBack1和CallBack2产生的效果是一样的,请问CallBack2处的pSender的作用是什么,为什么Sprite* sp = (Sprite*)pSender;后sp与sprite等效了? cpp中 void MyScene::goMenu(cocos2d::Ref* pSender){ log(""Tag=%i""this->getTag()); swi