staticField 和 staticInitializer 探针示例

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

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

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

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

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

    java.util.Date

  • 目标(要输入这些值,在树窗格中选择目标,然后单击编辑):
    • 目标类型include
    • com.sample*(此处使用实际的包名。)
    • *
    • 方法<init>
    • 方法特征符*
  • 目标(要输入这些值,在编辑窗格中单击添加,然后单击编辑):
    • 目标类型exclude
    • *
    • *
    • 方法*
    • 方法特征符*
  • (在树窗格中选择以输入这些值):
    • 段类型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]");