新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论Java, J2SE, J2ME, J2EE, 以及Eclipse, NetBeans, JBuilder等Java开发环境,还有JSP, JavaServlet, JavaBean, EJB以及struts, hibernate, spring, webwork2, Java 3D, JOGL等相关技术。
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Java/Eclipse 』 → [合集] 有没有人在关注Richard的AOP? 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 4093 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [合集] 有没有人在关注Richard的AOP? 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     admin 帅哥哟,离线,有人找我吗?
      
      
      
      威望:9
      头衔:W3China站长
      等级:计算机硕士学位(管理员)
      文章:5255
      积分:18407
      门派:W3CHINA.ORG
      注册:2003/10/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给admin发送一个短消息 把admin加入好友 查看admin的个人资料 搜索admin在『 Java/Eclipse 』的所有贴子 点击这里发送电邮给admin  访问admin的主页 引用回复这个贴子 回复这个贴子 查看admin的博客楼主
    发贴心情 [合集] 有没有人在关注Richard的AOP?

    ● [合集] 有没有人在关注Richard的AOP?发信人: oosky (天天), 信区: J2EE
    标  题: [合集] 有没有人在关注Richard的AOP?
    发信站: BBS 水木清华站 (Mon Mar 29 18:43:40 2004), 站内

    【 以下文字转载自 JavaClub 讨论区 】
    发信人: oosky (天天), 信区: JavaClub
    标  题: [合集] 有没有人在关注Richard的AOP?
    发信站: BBS 水木清华站 (Mon Mar 29 18:38:19 2004), 站内

    ☆─────────────────────────────────────☆  
    JoyJava (//admire lp~~~) 于  (Tue Nov 12 22:09:18 2002)  提到:

    Aspect Oriented Programming,听gty说可以定制一个类似j2ee的平台,呵呵,
    richard就是jboss、webwork、xdoclet的项目负责人



    ☆─────────────────────────────────────☆  
      UltraFool (遥望·遐想·感伤) 于  (Tue Nov 12 22:29:32 2002)  提到:

    我最想知道有没有大公司关注它:-)


    ☆─────────────────────────────────────☆  
    cloudor (我要打篮球!!!!!) 于  (Wed Nov 13 08:29:34 2002)  提到:

    呵呵,是rickard吧,:Oberg.
    这东西现在也是在做吧,有释放出来的资源了么,除了文字的?



    ☆─────────────────────────────────────☆  
    UltraFool (遥望·遐想·感伤) 于  (Wed Nov 13 12:04:21 2002)  提到:

    刚才在路上看到程序员杂志上的AOP的java实现
    www.aspectj.org


    ☆─────────────────────────────────────☆  
      cloudor (我要打篮球!!!!!) 于  (Wed Nov 13 13:31:51 2002)  提到:


    看到了,心情难以平静了.



    ☆─────────────────────────────────────☆  
    cloudor (大功即将告成!!!) 于  (Wed Nov 13 17:08:30 2002)  提到:


    rickard没有参与AspectJ吧。正在看一篇rickard关于aop的文章,
    将他自己写的aop和aspectj比较,说自己的虽然没有aspectj的
    functional completeness,但拥有更多的flexibility/scalability。
    (http://www.projectcast.com/~bungle/rickard_on_aop.html)

    AspectJ所具备的优点:
    1.拓展java语言使aop成为内建特性
    2.在编译时引入一个custom compiler将扩展语言转译为java语言。
    3.由于在java语言上拓展,因此可以对java语言使用的各种如
      构造器/方法/字段访问/静态块进行advice(advice的意思就是
      对任意过程进行建议/干涉,对方法调用进行指导)
    AspectJ的局限:
    1. java是一种非常容易上手的语言,而AOP扩展语言学起来却非常
      困难。
    2. 需要特别的编译器。
    3. 很难方便地为对象添加advice和extension,需要修改源码。
    4. 当一处进行改动时,整个项目源码需要重新编译,重新让编译器
       检查各个advice和extension,因此不适用于大项目的开发。(据说
       将在1.1版本中改善)
    5. 没有严格使用interface,因此对象可能会使用你无意中添加的
       feature。
    6. 没有引入EJB中管理对象所用的对象代理方法,不便保障更佳的对象粒度与
       提高重用扩展性能。

    rickard所追求的是一种集EJB的扩展性和AspectJ的AOP特性与一身的....
    (还没取名)




    ☆─────────────────────────────────────☆  
      cloudor (大功即将告成!!!) 于  (Wed Nov 13 17:32:37 2002)  提到:


    说白了,感觉AspectJ其实就是个代码辅助工具,因为各种advice和extension
    全是编译时加进去的,生成的class和普通class没有区别,没有办法动态加载
    新的advice和extension。



    ☆─────────────────────────────────────☆  
    JoyJava (//admire lp~~~) 于  (Wed Nov 13 17:43:15 2002)  提到:

    随着发展,动态都是有可能得,呵呵,aop凸现出来可能是编程思路得转化:

    oop讲究对象的重用性,而aop追求的是模块的重用性



    ☆─────────────────────────────────────☆  
      javarookie (JavaRookie) 于  (Wed Nov 13 18:37:06 2002)  提到:

    那酱紫是不是类似于STL啊?
    不懂的说




    ☆─────────────────────────────────────☆  
       cloudor (大功即将告成!!!) 于  (Wed Nov 13 19:10:07 2002)  提到:


    看rickard的架式好像就是冲着动态aop去的。其实EJB的部署原理就很象
    aop,EJB是把home/localhome interface和remote/local interface这些interface
    结合bean class生成一个新的对象,如果引入更多interface和class来创建
    一个新对象,可以说这就是aop的extension;而container将EJB的包裹起来
    并在调用中插入security/tansaction等interceptor,这其实就是aop的advice。

    而创建这么一个新对象的过程完全不需要停下虚拟机,所以ejb真的为
    aop做了很好的预备工作,也难怪rickard这么一个ejb专家会自然地把
    工作中心从EJB转向aop,因为实在有太多可以利用的东西了。



    ☆─────────────────────────────────────☆  
    JoyJava (//admire lp~~~) 于  (Wed Nov 13 19:51:44 2002)  提到:

    我觉得ejb做得预备工作不多,呵呵,component禾container很早就有了嘛
    倒是后来rickard做xdoclet,很像aop,呵呵



    ☆─────────────────────────────────────☆  
      cloudor (大功即将告成!!!) 于  (Wed Nov 13 20:31:25 2002)  提到:


    可我觉得xdoclet只是一个标签工具而已,没有动态地为对象添加方法以及
    在调用中插入interceptor的功能吧?

    而且,当时宣传j3ee也是拿aop取代ejb说事的,所以感觉rickard
    的aop平台会是在ejb-container基础上做出来的。



    ☆─────────────────────────────────────☆  
      JoyJava (//admire lp~~~) 于  (Wed Nov 13 21:01:36 2002)  提到:

    我们两个在盲人摸象,等gty能发文了让他谈谈吧


    ☆─────────────────────────────────────☆  
      bbjj (弱弱) 于  (Wed Nov 13 23:38:26 2002)  提到:

    据说可以很好的处理crosscutting,看了一点资料,没有尝试过,不知道具体情况。
    不过我觉得从粒度上来说,AOP总看着像是一种辅助的编程方式。不知道前途如何。
    呵呵。



    ☆─────────────────────────────────────☆  
      bbjj (弱弱) 于  (Wed Nov 13 23:40:01 2002)  提到:

    我也是这种感觉。至少目前好像就是这样。



    ☆─────────────────────────────────────☆  
      gty (宜良-丽江-蝴蝶泉) 于  (Thu Nov 14 01:16:53 2002)  提到:

    呵呵,xdoclet想要解决的问题,正是aop想要解决的问题,也是OO系统最大的
    缺陷。这个缺陷是什么?我也经常遇到,也常常在想,但都不是很清楚。但我
    可以把自己不成熟的想法要大概描述一下,希望大家指正:

    1. 首先,软件的发展主题是代码复用。这一点恐怕没有疑问。从面向过程到
    面向对象,是为了复用;现在从面向对象,到面向aspect(怎么翻译,cloudor?),
    也是为了复用。所以AOP是OOP的一种自然进步,不是否定。

    2. 面向过程是线性思维,面向对象是平面思维,面向aspect是立体思维(多维?),
    这和软件过程的发展有相同之处。起初的软件过程比较强调流程,需求-设计-编码
    -测试;后来发觉不是所有的软件系统都是类似流程,例如中国的项目和国外的
    项目过程就大相径庭(没有好坏之分,都是解决问题的),因此大家就来归纳,就像
    RUP宣传的,大项目应该怎么怎么个流程,内部产品研发应该怎么怎么个流程,归纳
    出的对象就类似于Class。大家都实现了“软件开发”这个方法,但流程不同。但过
    了一段又不行了,越归纳越多,天南的项目应该怎么做,地北的项目应该怎么做。忽
    然有一天,一帮人跳出来号召大家用一个新东西- XP(当然不是微软的东东)。

    这帮人倒好,XP中没有规定任何流程(我刚开始看XP时一直有一个疑问不好意思说,
    这个东西怎么没有quick start啊),而是列举了一大堆“Practice”,Unit Test,
    small Iteration,pair-working...,似乎杂乱无章,是一帮经验主义者。当然,也
    许他们确实是,但当我现在结合AOP再来想XP时,却不由得在意识里把它提高了一个
    层次,这些Practice都是为了处理某一方面的问题啊,Unit Test是为了验证工作,
    small Iteration是为了不断进行集成测试,pair-working是为了提高工作质量,在
    传统的开发流程中,需要用到它们的时候尽可以用,宣传最多的例子就是在需求阶
    段也可以有Unit Test和small iteration。

    3. 总的来说,随着应用系统的日益复杂,OO系统遇到了它的“成长上限”。OO分析
    试图将世界用一张UML Class图轧扁到纸上, 但世界分明是N维的,OO必然有克服不
    了的困难:

       a. OO的类的复用程度不高。明显的例子是,我们开发的应用层对象往往只能在
    自己的某个系统中有用,离开了系统则价值不大。电子商务系统中,Person的属性
    不可能包含肝脏,医疗系统中,Person也不需要有makeOrder的方法。

       问题来了,不同领域的系统中,对象如何复用?OO的思路只能是增加对象的属
    性和方法,或者是增加新的子类。无论如何,发展的结果,只能是让Person这个
    (组)对象变得越来越复杂。别忘了,咱们还有那么多类呢,听说某公司的财务软件
    达到了上千个类。

       AOP通过“动态”扩展Class解决了这个问题。AOP系统中,真正属于Class的属
    性也许只有一个标签,它的所有方法都可以由Aspect提供。例如Person对象也许
    只有它的Id作为识别,生理特性是一个Aspect,商务特性是一个Aspect,e-business
    系统中,我们为Person对象增加了商务特性Aspect,医疗系统中,我们为Person对象
    增加生理特性Aspect。1 - 3,看来AOP也把问题复杂化了,也许你会想。不,大部分
    情况下,这种分离会带来更高的复用水平,Aspect是可以复用的,因为一只狗的定购
    过程和人应该不会有很大区别,一只狗的内脏系统和人也不会差到哪儿去。

       当然,Aspect复用可能存在,也可能不存在,但至少提供了一种可能性,这就是
    一种进步。而且,根据Rickard Oberg在自己的portal产品项目的实践,Aspect复用
    的效果非常惊人!

       b. OO的方法的复用程度不高。明显的例子是,同样一个业务过程,希望突破部
    署环境的限制,既可以在Web层实现,又可以在EJB层实现,现有技术下就会遇到很
    大困难。例如Transaction,EJB层通常用Container自动控制Transaction,而Web层
    只能通过手工调用JTA或者Connection的Transaction控制方法。例如Security,EJB
    层可以从SessionContext获取调用者和调用者的角色,因此不需要在方法声明中有
    caller参数,而Web层则不能享有这种“优越性”。

       问题又来了,不同领域的,方法如何复用?OO的思路有二:其一,Proxy模式,
    保持核心类的方法不变,用一个不同的Proxy适应不同的环境,看过jive源码的人
    应该熟悉这个模式(SuperMMX?)。其二:政治手段,技术不能解决,那大家就来开
    会,谋求天下一统,于是JSP,EJB,Connector,struts,各种framework满天飞,但
    天下大势,分久必合,合久必分,EJB刚出规范,Weblogic就有自己的extension,
    Java的天下何时一统,其实很好回答,绝对不可能。

       AOP通过“动态”扩展Method解决了这个问题。AOP系统中,可以为某个类的某
    个方法增加advice,即Rickard的AOP中的Interceptor。Interceptor也是可以复用
    的。例如Transaction Manager, Security Manager,Persistence Manager,
    WebServices Manager都可以以Interceptor的方式实现。

        和J2EE架构的不同之处,在于“动态”二字。何谓动态:
         1).根据需求决定是否调用Interceptor,
         2).根据需求决定调用哪个Interceptor,
         3).根据需求决定如何调用Interceptor,以及各个Interceptor之间的次序。

        AOP的高度灵活的结构,体现了空间概念。它彻底打破了传统代码进入方法体
    后的线性执行方式,以及一个类由多个方法构成的平面执行方式。立体化的考虑
    问题,很酷吧。

    4. 既然面向过程-OO-(包括OA?不知道)都有“难以解决的”缺陷,为什么还会
    有黄金时期?因为应用在发展!我们单个程序员所“解决”的问题比起五十年前的
    复杂了何止成百上千倍?就和交通工具一样,步行-自行车-地铁,我们花一个小时
    可以从清华骑车到阜成门上班,不是很累吧,于是我们敢于到更远的但更有“钱途”
    的国贸上班,受不了了,时间要double,幸好城铁修好了,现在也只需要花一个小时。


    AOP的实现方法

    说了半天,回到本贴开始的主题上,我们谈谈XDoclet和AOP的关系,还有AOP的
    实现方法。目前看来,AOP的实现可以分为两条道路:改良和改革。

    一、改良派 - “打补丁的方式”
      代表:Xdoclet,AspectJ(!!!)
      主要主张:自动生成代码。环境虽有不同,我自岿然不动,所有和环境相关的代码
    都是自动生成!
      新变化的应对手段:扩展新的处理模块和代码模板,例如Xdoclet已经有了针对目
    前绝大多数EJB应用服务器的20多个扩展模块。

      评价:
      Xdoclet可以看作是EJB Container的延伸,是我们开发EJB中最实用的一种工具,
    可以开发出适应不同应用服务器的EJB。我们目前的项目自动生成的类占到70%,并
    且还有通过归纳模式,这个比例还有上升的空间!

      大家一定奇怪AspectJ也落入这个范畴,这是AspectJ虽然扩展出一套AOP语法,
    但在编译时却将AOP语言首先转化为OOP(这类似于xdoclet、EJB、C++的代码自动
    生成思路)。

      “打补丁”固然能够解决目前的问题,但绝对不是一个“彻底”解决问题的方式。
       1. 这种方式依赖于某种标准的制定,例如EJB Container依赖于EJB,XDoclet依
    赖于它制定的文档标签,AspectJ依赖于它的扩展AOP语法。一旦标准发生变化,
    甚至被遗弃,世界上会出现很多无意义的代码。

       2. 增加程序员的学习成本,每个补丁都内有天地,请君入瓮。

       3. 补丁打到一定程度,衣服一定会破的。说到底,补丁不是解决问题的根本办法。

    二、改革派
      代表:Rickard Oberg的AOP(dreambean.com),
      主要主张:用Dynamic Proxy (JDK1.3中最为革命性的一个特性)和reflection机制实现A
    OP

      前提: 在JDK1.3和JDK1.4中,Java的relfection机制性能有了很大提高,这一点从webwo
    rk和hibernate
    的速度可以体现。
      结果: 可以用最简单的API,用“100%纯Java”实现!
      评价:

      (有空再谈吧,如果有兴趣,建议大家看看下面的一些资料:
         Rickard的weblog : dreambean.com
         一个根据Rickard的思想的AOP实现: nanning.sourceforge.net
         两个依赖于reflection机制的项目:
           Webwork : 一个MVC framework, www.opensymphony.com/webwork
           Hibernate: 一个高质量的O-R Mapping framework,hibernate.sourceforge.net
         一篇Dynamic Proxy的介绍文章:http://www.smotricz.com/kabutz/Issue005.html

       )



    ☆─────────────────────────────────────☆  
      NullPointer (空指针·莫之夭阏) 于  (Thu Nov 14 06:20:00 2002)  提到:

    great!收获良多,
    知道除了AspectJ之外,还有dreambean.com这个好地方,呵呵,我喜欢后者的技术路线。



    【 在 gty 的大作中提到: 】                                                      
    : 呵呵,xdoclet想要解决的问题,正是aop想要解决的问题,也是OO系统最大的          
    : 缺陷。这个缺陷是什么?我也经常遇到,也常常在想,但都不是很清楚。但我          
    : 可以把自己不成熟的想法要大概描述一下,希望大家指正:                          
    : 1. 首先,软件的发展主题是代码复用。这一点恐怕没有疑问。从面向过程到           
    : 面向对象,是为了复用;现在从面向对象,到面向aspect(怎么翻译,cloudor?),   

    : 也是为了复用。所以AOP是OOP的一种自然进步,不是否定。                          
    : 2. 面向过程是线性思维,面向对象是平面思维,面向aspect是立体思维(多维?),   

    : 这和软件过程的发展有相同之处。起初的软件过程比较强调流程,需求-设计-编码      
    : -测试;后来发觉不是所有的软件系统都是类似流程,例如中国的项目和国外的         
    : 项目过程就大相径庭(没有好坏之分,都是解决问题的),因此大家就来归纳,就像    
    : ...................

    ☆─────────────────────────────────────☆  
    liyawei (首都机场的士司机杀手) 于  (Thu Nov 14 09:24:32 2002)  提到:

    真好
    我看了一下,发现AOP技术过分依赖JAVA语言本身的特性
    如PROXY,REFLECTION。如何在不同语言下实施呢?


    ☆─────────────────────────────────────☆  
    UltraFool (遥望·遐想·感伤) 于  (Thu Nov 14 12:03:39 2002)  提到:

    至少c#在这方面好像比java还强
    看gty大牛的文章真是长见识啊!呵呵


    ☆─────────────────────────────────────☆  
    rehte (Ava) 于  (Thu Nov 14 15:24:27 2002)  提到:

    看大牛的文章,巨长见识。
    谢谢gty!



    ☆─────────────────────────────────────☆  
      cloudor (大功即将告成!!!) 于  (Thu Nov 14 16:19:18 2002)  提到:


    嗯,感觉你前一部分说的是把编程的思想应用到开发工作的组织中来。

    需求-设计-编码-测试,对应面向流程的思想;
    RUP,对应面向对象的思想;
    XP,对应面向aspect的思想。



    ☆─────────────────────────────────────☆  
      kaoyan (xixi) 于  (Thu Nov 14 18:58:31 2002)  提到:

    怎么象c#里面的attribute



    ☆─────────────────────────────────────☆  
    gty (宜良-丽江-蝴蝶泉) 于  (Fri Nov 15 02:30:48 2002)  提到:

    AOP本身只是概念,和语言确实没有关系,事实上,几乎大部分
    高级语言目前都有AOP的实现(http://aosd.net/tools.html)

    proxy和reflection只是rickard的Java AOP实现中的主要技术,
    很多语言都有代码“内省(introspect)”机制,例如C#和COM.
    但dynamic proxy就不知道是不是都有了。



    ☆─────────────────────────────────────☆  
      gty (宜良-丽江-蝴蝶泉) 于  (Fri Nov 15 02:33:30 2002)  提到:

    是啊,我也很喜欢:)webwork,xdoclet都是非常简单实用的工具。

    ☆─────────────────────────────────────☆  
      gty (宜良-丽江-蝴蝶泉) 于  (Fri Nov 15 02:35:18 2002)  提到:

    听说C#可以在运行时访问注释,是真的吗?(我没用过C#)



    ☆─────────────────────────────────────☆  
    gty (宜良-丽江-蝴蝶泉) 于  (Fri Nov 15 03:01:30 2002)  提到:


    :)只是把两者做一下类比,都是比较新,又很难理解的概念,所以
    希望串起来能互相验证验证。

    可惜最近太忙,只有晚上有时间上BBS,不能和大家多讨论AOP。我也
    是最近刚接触这方面的东西,但一下子觉得非常有共鸣,解决了在J2EE
    开发方面的很多疑惑。

    今天我用dynamic proxy初步实现了目前用xdoclet自动生成的EJBProxy
    (功能主要是method delegation,local and remote switch, simple failover),
    感觉真是很简单,以后再也不用为每个session bean自动生成EJBProxy了。

    如果大家有兴趣,可以一起来做个基于AOP的框架(J3EE?),至少目前我们可以
    交流和共享一些Aspect和Interceptor。

    太晚了,睡觉去了,拜拜。


    ☆─────────────────────────────────────☆  
    neek2000 (泥壳) 于  (Fri Nov 15 08:44:27 2002)  提到:

    景仰啊,学到不少东西……



    ☆─────────────────────────────────────☆  
    liyawei (感谢NEEK2000友情提醒中) 于  (Fri Nov 15 09:20:48 2002)  提到:

    的确,使用DYNAMIC PROXY对EJB这种模型来说
    在客户端是非常干净的,而且可以方便的加入各种QOS,好象JBOSS里面用了不少
    从AOP的角度来看,这种解决方案应该是最好。不过与其他基于静态STUB的方案比
    DYNAMIC PROXY的开销实在太大,似乎差了一两个数量级。?
    基于反省的东西就是慢。不知道GTY手上有没有一些数据


    ☆─────────────────────────────────────☆  
    UltraFool (遥望·遐想·感伤) 于  (Fri Nov 15 12:52:48 2002)  提到:

    主要就是kaoyan讲的attribute吧,提供元数据,这点真的很牛啊
    对实现AOP肯定也有帮助吧
    您认为AOP思想成熟了会不会导致新的语言产生呢?


    ☆─────────────────────────────────────☆  
      gty (宜良-丽江-蝴蝶泉) 于  (Sat Nov 16 20:19:47 2002)  提到:


    呵呵,我可没资格说。
    但作为一个程序员,我还是希望变化不要太大,因此
    rickard的方法比aspectJ对我来说更有吸引力。




    ☆─────────────────────────────────────☆  
      gty (宜良-丽江-蝴蝶泉) 于  (Sun Nov 17 03:50:17 2002)  提到:

    刚才我做了一个简单的测试,结论是dynamic proxy的确会
    带来一定的系统开销,但是对实际系统的影响应该很小。

    测试描述:
       interface: BusinessInterface
              定义method : String echoString(String str);
       impl:      CoreImpl implements BusinessInterface
              实现echoString(String str),本测试提供了两种实现
              a. 轻负载
                  仅仅是 return str;
              b. 模拟实际负载
                  在sleep 10ms之后,return str;
       static Proxy: MyProxy implements BusinessInterface
              属性 private CoreImpl coreImpl = new CoreImpl();
              实现echoString(String str)
                 return "myproxy:"+ coreImpl.echoString(str);
       Dyna Proxy's handler :MyHandler implements InvocationHandler
              构造函数将CoreImpl对象传入
                final Object realObject;

                public MyHandler(Object realObject) {
                    this.realObject = realObject;
                }
              实现java.lang.refelect.Proxy.InvocationHandler的invoke方法
                public Object invoke(
                    Object target,
                    java.lang.reflect.Method method,
                    Object[] arguments)
                    throws Throwable {
                    return "myproxy:"+method.invoke(realObject, arguments);
                }

       Test Class: Tester
              1)测试静态Proxy
            public static void testMyProxy(int count)
            {
                    long start = System.currentTimeMillis();

                    MyProxy proxy = new MyProxy();

                    long created = System.currentTimeMillis();

                    System.out.println("create time:"+(created-start));

                    for (int i = 0; i<count;i++)
                            proxy.echoString("ok");

                    long end = System.currentTimeMillis();

                    System.out.println("execution:"+(end-created));

                    System.out.println("duration:"+(end-start));
            }
              2)测试动态Proxy
            public static void testDynaProxy(int count)
            {

                    long start = System.currentTimeMillis();
                    BusinessInterface proxy = (BusinessInterface)java.lang.reflect.P
    roxy.newProxyInstance(
                                    BusinessInterface.class.getClassLoader(),
                                    new Class[] {BusinessInterface.class},
                                    new MyHandler(new CoreImpl()));

                    long created = System.currentTimeMillis();

                    System.out.println("create time:"+(created-start));

                    for (int i = 0; i<count;i++)
                            proxy.echoString("ok");

                    long end = System.currentTimeMillis();

                    System.out.println("execution:"+(end-created));

                    System.out.println("duration:"+(end-start));
            }
        JDK1.4.0
        CPU: Intel P3 800
        OS: Windows 2000


    测试结果 (所有时间单位都是ms)

    对方法调用的测试结果
    1) 当CoreImpl为轻负载实现(a)时,结果如下
    count         100             1000           10000          100000
             static  dyna    static  dyna    static  dyna    static  dyna
    execute   0      10       10     30       30     80      140    260
    平均额外负载    .1              .02             .005            .0012

    分析:方法执行时间的差距随着执行次数增加,逐渐减小

    2) 当CoreImpl模拟实际负载(10ms)(b)时,结果如下
    count        100              1000
              static  dyna     static  dyna
    execute   1011   1012     10064   10095
    平均额外负载      .11              .031

    分析: 方法执行时间的差距很小
           平均额外负载和轻负载时大致相同

    结论

    Dynamic Proxy的构建和执行会带来一定的系统额外开销,当调用100次时,平均额外的
    负载为.1毫秒。但是,以下因素会让这种开销的影响减小甚至消除:
    * 将构建的Dynamic Proxy实例缓存
    * 随着方法的执行次数增加,平均额外负载也会迅速减小
    因此,对于大多数“应用程序”(数据库操作/远程调用)来说,使用Dynamic Proxy对
    系统性能的影响应该很小,更不会有“一两个数量级”的差距。

    实例:hibernate使用了dynamic proxy进行lazy loading,使用了大量reflection api
    进行O-R mapping,但是其却是同类产品中速度最快的之一(当然也不是因为用了reflectio
    n:))


    ☆─────────────────────────────────────☆  
    cloudor (大功即将告成!!!) 于  (Sun Nov 17 09:16:40 2002)  提到:


    嗯,该好好学学,少点空想,多点实际测试。



    ※ 修改:·qyjohn 于 Mar 30 09:43:32 修改本文·[FROM:   219.238.203.*]           

    索引页面|上一篇|下一篇


       收藏   分享  
    顶(0)
      




    ----------------------------------------------

    -----------------------------------------------

    第十二章第一节《用ROR创建面向资源的服务》
    第十二章第二节《用Restlet创建面向资源的服务》
    第三章《REST式服务有什么不同》
    InfoQ SOA首席编辑胡键评《RESTful Web Services中文版》
    [InfoQ文章]解答有关REST的十点疑惑

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/9/23 0:40:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Java/Eclipse 』的所有贴子 点击这里发送电邮给Google AdSense  访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/9/14 0:34:59

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    108.887ms