staticField 和 staticInitializer 示例

此示例演示 staticField 数据项和 StaticInitializer 探针段的用法。

在此示例中,探针跟踪创建类的实例的时间。如果一个实例是在创建该类的前一个实例之后经过不止一秒才创建的,探针就会写日志消息。

下面是此探针完成的工作:
  1. 通过使用 staticField 数据项,探针在每个被探测类中创建类型为 Date 的静态字段。将通过调用 new Date(); 来对静态字段进行初始化。
  2. staticInitializer 段中,在装入被探测类时探针将该类的 Date 实例设置为“时间 0”(1970 年 1 月)。
  3. entry 段(由于目标规则,entry 段仅在构造方法中执行)中,探针会检查何时执行了上一次更新,如果更新是在不止 1 秒钟之前执行的,则还将发出报告。
  4. 最后,探针会将 Date 实例的值更新为“now”。

此探针使用 staticField 来在每个被探测类中创建新的静态字段。比较起来,使用 fragmentAtClassScope 来声明 Date 字段将使 Date 的单个实例出现在保存探针段的生成类中,与将探针应用于多少个类无关。如果想要跟踪创建任何被探测类的实例之间的时间延迟,而不是跟踪创建每个被探测类的实例之间的延迟,则可以这样做。

要使用此示例代码,更改 target 对象中的 package="com.sample*" 以引用实际的包名。

注意,要在 XML 中使用字符 &<,必须指定字符实体 &amp;&lt;,如示例中所示。

<?xml version="1.0" encoding="ASCII"?>
<probekit>
  <probe>
    <target type="include" package="com.sample*" method="&lt;init>" />
    <target type="exclude" package="*" />
    <staticField type="java.util.Date"/>
    <fragment type="entry">
      <data name="lastInstanceDate" type="staticField"/>
      <data name="clname"/>
      <code>
         java.util.Date d = new java.util.Date();
         long now = d.getTime();
         long prev = lastInstanceDate.getTime();
         if (prev != 0 &amp;&amp; prev + 1000 &lt; now) {
           System.out.println("[" + clname + " instance after > 1 second]");
         }
         lastInstanceDate.setTime(now);
       </code>
    </fragment>
    <fragment type="staticInitializer">
      <data name="lastInstanceDate" type="staticField"/>
      <data name="clname"/>
      <code>
         lastInstanceDate.setTime(0);
         System.out.println("[" + clname + " class loaded]");
      </code>
    </fragment>
  </probe>
</probekit>

上级主题:Probekit 示例

相关参考
StaticField 探针对象
staticInitializer 探针段

Copyright IBM Corporation and others 2000, 2004.