staticField 和 staticInitializer 示例

本示例说明了 staticField 数据项和 StaticInitializer 探测片段的使用。

在该示例中,探测保持跟踪类的实例的创建时间。如果在该类的前一个实例之后多于一秒的时间后才创建实例,则探测将写入一条日志消息。

以下是该探测执行的操作:
  1. 使用 staticField 数据项,该探测在每个探测的类中创建类型 Date 的静态字段。将通过调用 new Date(); 初始化该静态字段。
  2. staticInitializer 片段中,当探测的类装入时,该探测将它的 Date 实例设置为“0 时间”(1970 年 1 月)。
  3. entry 片段中(因为目标规则,entry 片段仅在构造函数中执行),该探测查看先前的更新的执行时间,并且如果该更新是在大于一秒的时间前执行的话,将发出报告。
  4. 最后,该探测将 Date 实例的值更新为“现在”。

该探测使用 staticField 在每个探测的类中创建一个新的静态字段。通过比较,使用 fragmentAtClassScope 声明 Date 字段将导致 Date 的单个实例出现在保留这些探测片段的已生成类中,而无论该探测应用于多少类。如果您希望跟踪任何探测的类实例创建之间的时间延迟,而不是每个探测的类实例创建之间的延迟,则可以进行此操作。

要使用该示例代码,请更改目标对象中的 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 探测片断

使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2004. All Rights Reserved.