快速业务通道

Classwo***ng工具箱: 将aspect放到werk中 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
灵活

清单 7 的输出看起来有用一些了,但是缺少选择性。如果对大的斐波纳契数列(比如说 12)使用这 段代码,将会看到长时间的滚动输出。作为开发一个有用的日志记录 aspect 的最后一步,我将实现对输 出的一些灵活的筛选。

最后我还想做成一个可以用来记录执行路径和相关性能度量的 aspect,这样就可以看到执行时间最长 的方法调用。我使用的方法类似于我在关于 Java 编程动态性的文章中所展示的方法,它基于 java.lang.System.currentTimeMillis() 时间值,使用直接 classwo***ng。 这个计时器不是非常精确 —— 在 Microsoft Windows 上,分辨率约为 17 毫秒,在我的 Linux 系统上,约为 1 毫秒 —— 但是 可以在所有版本的标准 Java 平台上找到它,这使得它至少在展示方面还是有用的。(下个月,我将讨论 获得更好的计时器分辨率。)根据方法调用所花的时间筛选执行踪迹会得出一些有趣的结果。

为了保持同样的输出结构,这个基于时间的筛选要稍微复杂一些。首先,需要延迟打印每个方法调用 的“进入”线(“entering”line),直到可以确定所用的时间足以使它通过我的筛选器。这本身并不困 难,但是我发现 真的 需要打印方法信息时,首先需要打印每一个包围方法调用的进入线。为此我需要保 持还没打印的方法的进入信息列表,然后在打印当前方法的进入信息之前将它们都转储出来,并带有正确 的缩进。清单 8 显示了修改后的新 advice 方法,以使它使用这个未打印的方法列表。

清单 8. 带时间筛选器的 Advice 方法

private ArrayList m_unprintedCalls = new ArrayList(); private void indent(int depth) {    for (int i = 0; i < depth; i++) {      System.out.print('' '');    } } public Object traceTimed(JoinPoint join) throws Throwable {    // add joinpoint to list pending print    m_pendingPrints.add(join);    // time joinpoint execution    long start = System.currentTimeMillis();    m_nestingDepth++;    Object result = join.proceed();    m_nestingDepth--;    // remove joinpoint if still on pending list    // (will always be last in list)    boolean entered = true;    if (m_pendingPrints.size() > 0) {      m_pendingPrints.remove(m_pendingPrints.size()-1);      entered = false;    }    // check if execution time above cutoff    long time = System.currentTimeMillis() - start;    if (time > 1) {      // print all unprinted "entering" lines       int count = m_pendingPrints.size();      for (int i = 0; i < count; i++) {        // print entering information for nesting call        // (nesting depth based on start of pendings)        indent(m_nestingDepth-count+i);        JoinPoint prior =          (JoinPoint)m_pendingPrints.get(i);        System.out.print("Entering ");        printCall(prior);        System.out.println();      }      // clear all pendings now that they''re printed      m_pendingPrints.clear();      // print exiting information including time      indent();      System.out.print("Leaving ");      printCall(j

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号