基于Lua的AOP架构_第1页
基于Lua的AOP架构_第2页
基于Lua的AOP架构_第3页
基于Lua的AOP架构_第4页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于Lua的AOP架构基于Lua的AOP架构 摘要:在本文中,我们描述了一个面向方面的架构基于Lua语言来处理动态AOP。这种架构是由AspectLua组成,一个Lua扩展,支持对象的声明,元对象协议,LuaMOP,即通过统一提供的Lua自监察和反射机制。对象使用AspectLua孤立定义,然后将它们通过LuaMOP编织。 AspectLua的一个重要特点是允许的应用程序代码的未声明的对象元素(预接合点)。此外,它结合了一系列功能,使AOP更方便,功能强大。关键字:MOP;反射;AOP;AOP动态;Lua;预接合点1. 引言面向方面编程(AOP)因专注于横切关注点模块化而广获关注,。一般情况下,面向方面的方法是静态的 - 方面代码和组件(基本代码)在编译时(静态织)混合。在这种情况下,需要一特殊的编译器的方面代码与基码相结合。虽然这种策略避免了类型不匹配,它规定了应用程序动态演化的限制。最近一些动态的方法已经被提出了在运行时支持织造。一般来说,他们都建立在一个脚本语言之上如Python13,Ruby14,和Smalltalk 22。我们选择Lua语言来处理动态AOP因为它是动态类型以及它用于在底层解释器时无需为修改延伸它的行为提供设施。这些设施进行了探索在AspectLua和LuaMOP的定义。我们认为,这引入了一个不同的风格面向方面的编程,动态是一个关键问题,编织是在运行时完成的,这两个组件和方面可以插入和删除的应用程序在运行时。此外,Lua的理念简而小。我们的目标是保持这一理念在我们的AOP架构。2. 面向方面编程的基本概念面向方面编程强调有必要去耦合那些与该应用程序中的横切组件。虽然目前还没有有关的术语和面向方面编程的要素达成共识,我们在这项工作中参考AspectJ中10中使用的术语,因为它是最常用的面向方面的编程语言。这构成AOP的元素有:接合点、切点、通知 、混入。说明接合点的一个很好的示例是:在代码调用一个方法时,发生调用的那一点被认为是一个接合点。切点用于指定或定义希望在程序流中截获的接合点。切点还包含一个通知,该通知在到达接合点时发生。因此,如果在一个调用的特定方法上定义一个切点,那么在调用该方法或接合点时,AOP 框架将截获该切点,同时还将执行切点的通知。通知有几种类型,但是最常见的情况是将其看作要调用的另一个方法。在调用一个带有切点的方法时,要执行的通知将是另一个要调用的方法。要调用的这个通知或方法可以是对象中被截获的方法,也可以是混入的另一个对象中的方法。3. 面向方面的基础结构AOP的LUA支持由用于定义动态名为LuaMOP一元对象协议编织方面的一个方面类提供。图1展示出了组成,我们称之为AspectLua AOP架构的块。第一层是由与它的反光设施Lua语言的。第二层是由所述LuaMOP设施取的Lua反射机制的优势。 LuaMOP提供了一组支持动态引入第三层定义方面的元类。 AspectLua提供方面类AOP元素的定义。程序员可以利用AspectLua的任何LuaMOP或者Lua的反光特性。此外,AspectLua不违反Lua语言的内在机制,因为它是建立在Lua的反射功能基础上。图1:AspectLua结构3.1 LUAMOPLuaMOP是支持的元表示的创建以构成上述的Lua运行时环境中的每个元件的元对象协议:变量,函数,表格,用户数据等。各元件由一元类提供一组的方法来查询和修改基类的每个元素的行为来表示。它们在元对象是基间位类(图2)的分层方式组织的。从这个元类衍生出来的变量元,元函数,元协程,元表,以及元的UserData元类。此外,LuaMOP还提供了一个监视器类,以监测的Lua运行时环境中的事件的发生。图2:LuaMOP 类图通过LuaMOP提供的元表示通过的getInstance(实例)方法的调用创建。此方法返回对应于与由实例参数描述名称或参考的对象的元对象。此元对象是上述的元类的一个实例。对于每个元类有描述,并在支持改变的元对象的行为的方法。因此,的getType()和的getName()方法可以由所有的元类被调用,因为这些方法都是元对象的元类的一部分。这些方法返回,分别为元对象类型和名称。在destroy()方法来断开元对象。addPreGet,addPosGet,addPreSet和addPosSet方法插入一个函数之前(或之后)可变读或写被执行。图3展示出了使用这些函数的一个例子。在第一行,余量变量被设置为10.在下一行,则创建一个元对象来表示平衡变量。以下四个行声明的checkRead功能,并与metavar元对象该功能相关联,通过addPreGet方法。这些功能的主要目的是,以控制进入平衡变量。因此,如果由addPreGet方法插入函数返回一个值从零不同,阅读过程被中断。其他功能的存在,要求所有函数返回零,可以读取所有变量。这LuaMOP标准行为可以通过setAvalPreGet(funcaval)函数进行修改。所述funcaval函数接收作为参数的表,通过使用addPreGet方法插入的功能所提供的所有的结果。基于此列表中,funcaval函数返回一个非零值中断阅读。图3:add方法 LuaMOP例子元函数类代表一个Lua应用程序的所有功能。这个元类提供了以下方法:getNameFunction,getFunction和setFunction。 getNameFunction()方法获取由元对象引用的函数名称。 getFunction()方法获取由元对象所引用的功能,并setFunction(newfunction)允许变形例中,在运行时,该功能的行为。所提供给有关元对象细节的一些其他功能:getSrcDefined()返回包含函数定义的文件; getLineDefined()返回包含函数声明行; getTypeFunction()确定如果一个函数写在Lua或c; getNameWhat()标识,如果功能是全局或本地。图4:setFunction LuaMOP例子元函数元类还提供addPreMethod,addPosMethod和addWrapMethod方法。这些方法定义了其中添加行为的地方:Pre(前),Pos(后),并包裹函数的执行。使用这些函数的一个例子在图5中示出。图5:addPosMethod LuaMOP例子获得元对象在第5行,addPostMethod方法被调用,从第1行定义的reglog函数添加到3.当执行deposit方法(行6),则LuaMOP机制自动调用reglog方法。以控制与给定的行为相关联的功能,元函数提供了以下方法:getZMethods,setZMethods和delZMethods。所述getPreMethods方法,例如,返回加入到预行为的所有方法的列表。由getPreMethods提供的列表是有序的,并作为参数发送到setPreMethods方法。这后一种方法修改的定义到预行为的方法的执行顺序。的方法的去除可以使用delPreMethods方法来完成。元表类表示应用程序表,并提供以下功能:getfield命令,getAllFields和setField。该getfield命令(名称)方法接收字段名参数,返回表示它一个MetaField。所述MetaField类从MetaVariable类继承和,其结果是,提供了一个MetaVariable的相同的功能。例如:添加读取变量的值之前调用的函数。要获得元表的所有MetaFields,()可以使用功能getAllFields。setField(name,value)方法用于修改表字段,如果它不存在,插入表字段。在Lua中,类由表元素表示。因此,该setField方法可用于添加两个新的属性和新方法。尽管元对象提供setField方法的事实,它不排除使用另一种机制来插入新字段。元对象的作用是保持因果关系,并根据在所述基础对象的变化来更新它的属性。图6示出这种行为的示例。图6:LuaMOP和因果关系关于行1和2中的Account对象与平衡属性定义。在下一行,创建一个元对象来代表Account对象。在这一刻metaAccount元对象只平衡作为MetaField。在第5行,一个新的领域,NameAccount,被定义为Account对象。这个动作改变了基础对象,并触发metaAccount元对象,提供了getfield命令的方法与名称NameAccount恢复MetaField的自动修改。这样MetaField提供MetaVariable的相同的功能。这使得addPosSet方法来处理NameAccount领域的修改的调用。3.2 ASPECTLUAAspectLua定义了一个Aspect类来处理所有方面的问题。因此,AspectLua提供了一个抽象层,用户可以定义在任何LuaMOP或者Lua的反光设施AOP元素。使用AspectLua,有必要通过调用新功能来创建AspectLua类的一个实例。创建一个新的实例后,有必要定义一个包含aspect元素(名称,明确定义的点组,操作定义)一个Lua表。图7示出的一个方面的定义: aspect方法的第一个参数是aspect名称; 第二个参数是定义切入点元素一个Lua表:其名称,标志和必须被截取的功能或变量。该标志定义切入点类型。 AspectLua支持以下几种类型:调用函数调用; callone为必须只执行一次的方面;介绍在表(在Lua对象)引入的功能;并获得和应用组可变量。该列表字段定义将被拦截的函数或变量。它是没有必要的要被截取的元素已经被声明。这个列表可以使用通配符。的,例如银行*意味着方面应适用于银行类的所有方法; 最后,第三个参数是一个Lua表,它定义了具体操作元素:类型(后,前,各处,等等),并且操作到达切入点时要采取。在图7中,logfunction充当到存款功能的一个方面。对于每个存款函数调用,logfunction之前它以打印存款值调用。图7:定义方面的例子该方面方法的调用定义了切入点的各个方面,并返回一个aspect标识(ID)。因此,为了用相同的aspect有必要调用每个切入点的aspect各切入点关联。要管理的定义方面,AspectLua提供下列功能:getAspect(ID),GETALL(),removeAspect(ID)和updateAspect(ID,newasp)。的getAspect和GETALL方法可以用来得到一个或已经定义的所有方面。得到一个方面中后,它可以修改或通过使用updateAspect方法来更新它的元素。这种方法可以修改切入点和一个方面的具体操作已定义。方面除去可以通过使用removeAspect方法来完成。在图7中,用存款方式的银行对象被声明后,连接点的定义。在以前的版本AspectLua,因为需要一个连接点的每个目标的方法是以前声明的这个定义是不可能的。为了解决此限制,AspectLua的当前版本使用显示器来实现预接合点 - 一个连接不具有一个元对象点,但具有与之相关联的显示器。预接合点允许定义一个连接点对于尚未在应用程序中声明的元素的程序员。此外,有可能拦截即使它不在应用存在这个连接点。这是预接合点和其它作品1,3,6,10实施了一些解决方案之间的主要区别。这些解决方案支持连接点,尚未被宣布但每个截取连接点恰好就在已经被加载元素的元素的定义。因此,如果没有加载元件,该连接点不截获。在AspectLua能够拦截连接点为既不定义也不加载元件。图8中的存款方法具有将收到执行两个方面。缺省情况下,执行顺序是方面定义的顺序。因此,logfunction将checkRights之前被执行。存款和定义不同的顺序的表:修改该顺序,setOrder可以用下面的参数来使用。为了得到一个变量或函数的信息,getOrder被调用接收其名作为参数。图8:定义为方面调用AspectLua还允许通过引入标志中的一类采用新的方法。图9显示了在引进银行类的退出方法。此标志不要求的具体操作类型。图9的最后一行显示,引入了新的方法后,可以以相同的方式使用如前述现有的方法。3.3 性能评估本节讨论关于在Lua的执行环境中使用元表示的性能问题。测试比较的执行时间使用和不使用的元对象。这种方式,有可能通过比较函数X和Y,分别被执行,在执行时间,以验证在调用过程的元对象存在的影响,在59.72微秒和3.91微秒与没有关联的元对象他们。评估是在PC毒龙的1.6MHz完成256MB的RAM,使用Linux,Mandrake 9.2。图11:预接合点执行表1示出的性能测试的结果。第一行显示的X和Y的函数的执行时间,并与包含在Y函数作为PreMethod一元对象相关联的X函数的执行时间之间的比较。所不同的是低考虑到元对象需要管理信息的时间。第二行相比较属于一个对象(表)的方法的访问和执行时间,例如Bank.X(),与一元对象相关联的同一个对象。仅当,在下面的行,函数(Y)的与X功能之后所要执行的银行元对象相关联的这两个调用之间的差异会更大。在这种情况下,从2.15s的差增大(在前面的线),以6.7s这种差异是有关的时间参与装载与Metafield相关联的功能的量。4. 相关研究相关研究包括内置脚本语言之上的一些AOP的语言。最重要的是基于公知的脚本语言3的AOP扩展:Python的13,Ruby14和Smalltalk4。 AOPy2是建在Python之上。 AOPy实现通过包装的具体操作方法里面截取于方法。方面定义使用标志调用,只是一个连接点可以在一个切入点来定义。与此相反,AspectLua支持的几个连接点的定义。 AspectR1是建在Ruby之上。它通过包装代码围绕现有的类中的方法实现AOP和支持通配符。方面6是一个佳乐/ Smalltalk的扩展,以支持AOP。它采用模块和元级编程来处理AOP。它还支持通配符。LAC - Lua的貌组件5 - 是一个Lua扩展,其主要目标是支持貌组件(AC)的概念11。 LAC是从AspectLua完全不同,因为它的元素,以支持同时AspectLua元件被以下传统AOP概念定义AC的想法来定义。 LAC规定,其中组件和方面是由不同风格的类来定义的模板。与此相反,AspectLua使用表来表示的方面。 LAC的重点是实现交流的典范。定义这个模型后,Lua中被选择来实现它。相比之下,AspectLua的重点是使用Lua因为没有引入新的命令或结构的AOP语言。PROSE19是一个动态的AOP扩展Java语言。作为AspectLua,散文不引入定义方面的新的语法。它使用Java语言本身。以同样的方式,没有必要特别的编译器。它使用Java虚拟机调试接口(JVMDI)和刚刚在实时(JIT)功能,使其能够拦截和方面的执行。然而,从散文AspectLua的主要区别在于,AspectLua使用纯解释的方法。5. 结语在本文中,我们提出了基于Lua的一个AOP的基础结构。基础结构是由LuaMOP和AspectLua的。切面使用AspectLua定义。 LuaMOP支持探索的Lua的反射功能动态编织。我们已经详细描述织造过程是如何发生的。作为各方面使用的Lua表中定义,它是没有必要使用不同的语言的功能代码和方面的代码。对于这两种方案使用Lua语言。这是保持Lua的理念的一种理念 - 简而小。基础结构提供了一系列的介绍中具有很大的灵活性,以AOP功能:可以在运行时定义方面;它支持方面优先顺序,通配符,并与未申报要素方面的协会的定义。值得指出的是,预接合点的概念是动态性非常有用,因为它允许根据组件程序的新功能方面的动态插入。它超越了目前的AOP方法,其中连接点都与静态定义的元素,或者顶多连接点与该动态加载元素,但拦截过程之前有关。动态AOP语言的想法并不新鲜。然而,在这项工作中呈现的动态AOP的方法结合的一组没有被其他AOP语言一起提供的功能。我们选择的Lua,因为它体积小,易于使用,它提供了反射机制,使语言的扩展。参考文献1A.科比,R. 费尔德。 AspectR - Ruby简单的面向方面编程。 /,2002。2D.德肖。动态分离,轻量级语言,第5生成编程和组件工程。3答加尔,W.施罗德-Preikschat,O. Spinczyk。 AspectC +:语言和具体操作实施的原型。 OOPSLA 2001研讨会在面向对象的系统,坦帕关注的先进分离 - 佛罗里达州,2001年10月。4A.戈德堡,D罗布森。Smalltalk-80:语言及其实现。 艾迪生-韦斯利出版社,1983年。5S。赫尔曼,M Mezini。结合组成样式在演化语言LAC。在ASoC研讨会ICSE-国际软件工程大会,2001年。6R.赫希菲尔德。面向方面编程。从国际会议NetObjectDays上的对象修订文件,组件,架构,服务和应用程序的网络世界里,LNCS 2591,页216-232,施普林格出版社,伦敦,2002年。7R. Ierusalimsky,L. H.菲格雷多,W. Celes LUA - 一个可扩展的扩展语言。软件:实践与xperience,26(6):635-652。 1996年。8P.梅斯。概念和实验计算反射。在面向对象编程,系统,语言和应用程序(OOPSLA),佛罗里达州奥兰多市,第147-155页,1987。9G.Kiczales,J.Lamping,A.Mendhekaretal.Aspect-面向对象编程。在ECOOP97 - 面向对象程序设计欧洲会议。施普林格出版社,芬兰。 1997年。10 G.Kiczales,E.Hilsdale,AspectJ的的J.Huguninetal.AnOverview。在ECOOP2001 - 面向对象程序设计欧洲会议。匈牙利首都布达佩斯。 2001年。11K.Lierberherr,D.Lorenz与貌组件M.Mezini.Programming。技术报告NU-CCS99 -01,Notheastern大学。1999年。12R.Miles.LazyLoadingwithAspects.ONJ,/pub/a/onjava/2004/03/17/lazyAspects.html。2004年。13G. Rossum。 Python的参考手册,http://doc/current/ref/ref.html。 2003。14D.Thomas,A.Hunt.ProgrammingRuby:APragmatic程序员指南./book/ 2004。15N.卡丘,T巴蒂斯塔。 AdaptaoDinmica implementao在第23届巴西研讨会计算机网络(SBRC2005),SBC,福塔莱萨,CE,2005年5月,页495-508。16A.安德森,G. S.布莱尔F. Eliassen。反射基于组件的中间件服务质量管理。在PROMS 2000年,多媒体系统的协议。波兰克拉科夫,2000。17 G.S.Blairetal.ThedesignandimplementationofOpen ORB v2中。 IEEE分布式在线系统,2(6),2001年。http:/www.cs.uit.no/aa/abstracts/blair2001a.htm湖18J。Sztipanovits,G Karsai。生成程序的嵌入式系统。该ACM SIGPLAN / SIGSOFT会议生成编程和组件工程。讲义在计算机科学(LNCS),卷。 2487,第32-49,2002。19Nicoara,G阿隆索。动态AOP散文。计算机科学系。科技苏黎世瑞士联邦理工学院。 www.iks.inf.ethz.ch/publications/publications/files/ PROSE-ASMEA05.pdf20千叶,S.AMetaobjectProtocolforC +。InObject-面向对象编程,系统,语言和应用程序(OOPSLA),德克萨斯州奥斯汀,1995年10月,第2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论