staticField 和 staticInitializer 探针示例

本示例说明了如何使用 staticField 数据项和 staticInitializer 探针段。

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

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

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

此探针在 Probekit 编辑器中是由下列条目定义的:
  • 静态字段的标准 Java 类型(右键单击树窗格中的探针,然后单击新建 > 静态字段以输入此值):

    java.util.Date

  • 目标(要输入下列值,在树窗格中选择目标,然后单击编辑):
    • 目标类型包括
    • 包名模式com.sample*(在此处使用实际的包名。)
    • 方法名模式<init>
  • 目标(要输入下列值,在编辑窗格中单击添加,然后单击编辑):
    • 目标类型排除
    • 包名模式*
  • (在树窗格中选择以输入下列值):
    • 段类型entry
    • 数据项
      • 数据类型staticField名称lastInstanceDate
      • 数据类型className名称clname
    • Java 代码

      java.util.Date d = new java.util.Date();
      long now = d.getTime();
      long prev = lastInstanceDate.getTime();
      if (prev != 0 && prev + 1000 < now) {
        System.out.println("[" + clname + " instance after > 1 second]");
      }
      lastInstanceDate.setTime(now);

    • (右键单击探针并选择新建 > 以输入下列值):
      • 段类型staticInitializer
      • 数据项
        • 数据类型staticField名称lastInstanceDate
        • 数据类型className名称clname
      • Java 代码

        lastInstanceDate.setTime(0);
        System.out.println("[" + clname + " class loaded]");

反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.