staticField および staticInitializer プローブの例

この例では、staticField データ項目および staticInitializer プローブ・フラグメントの使用方法を示します。

この例のプローブは、クラスのインスタンスがいつ作成されるのかを追跡します。インスタンスが作成された後、同じクラスのインスタンスが次に作成されるまでに 1 秒より多く経過していた場合、プローブはログ・メッセージを書き込みます。

このプローブは、以下のことを行います。
  1. プローブは、static フィールド定義を使用して、 プローブ済みの各クラスに Date 型の静的フィールドを作成します。静的フィールドは、new Date(); を呼び出すことによって初期化されます。
  2. プローブは、staticInitializer フラグメントで、ロードされたときにプローブ済みクラスの Date インスタンスを「time zero」(1970 年 1 月) に設定します。
  3. プローブは、entry フラグメントで、前回の更新がいつ実行されたかを調べ、その更新が実行された時点から 1 秒より多く経過していた場合、報告を出します。 (ターゲットの規則により、entry フラグメントはコンストラクターでのみ実行されます。)
  4. 最後に、プローブは Date インスタンスの値を「now」に更新します。

このプローブは、static フィールド定義を使用して、プローブ済みの各クラスに新しい静的フィールドを作成します。これと比較して、クラス有効範囲でのフラグメントを使用して Date フィールドを宣言すると、 プローブが適用されたクラスがいくつあっても、プローブ・フラグメントを保持する生成済みクラスに、Date のインスタンスが 1 つ現れます。各プローブ済みクラスのインスタンス作成間の遅延を追跡するのではなく、任意のプローブ済みクラスのインスタンス作成間の遅延を追跡したい場合に、この方法を実行できます。

このプローブは、Probekit エディター内の以下のエントリーによって定義されています。
  • static フィールドの完全修飾 Java の型 (ツリー・ペインの「プローブ (Probe)」をクリックして、次に「新規」>「static フィールドとクリックしてこの値を入力します):

    java.util.Date

  • ターゲット (これらの値を入力するには、ツリー・ペインの「ターゲット」を選択して、 次に「編集」をクリックします):
    • ターゲット型: include
    • パッケージ: com.sample* (ここでは実際のパッケージ名を使用します。)
    • クラス: *
    • メソッド: <init>
    • メソッド・シグニチャー: *
  • ターゲット (これらの値を入力するには、「追加」をクリックし、次に編集ペインの「編集」をクリックします):
    • ターゲット型: exclude
    • パッケージ: *
    • クラス: *
    • メソッド: *
    • メソッド・シグニチャー: *
  • フラグメント (これらの値を入力するには、 ツリー・ペインの「フラグメント (Fragment)」を選択します)。
    • フラグメント型: エントリー
    • データ項目:
      • データ型: 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);

    • フラグメント (「プローブ (Probe)」を右マウス・ボタン・クリックして、 新規」>「フラグメント (Fragment)と選択し、これらの値を入力します):
      • フラグメント型: staticInitializer
      • データ項目:
        • データ型: staticField名前: lastInstanceDate
        • データ型: className名前: clname
      • Java コード:

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