staticField 和 staticInitializer 探測範例

這個範例示範 staticField 資料項目和 staticInitializer 探測片段的用法。

在範例中,探測會追蹤類別的實例何時建立。如果在該類別的前一個實例建立之後,超過一秒才建立下一個實例,探測就會撰寫一則日誌訊息。

下面就是這個探測所做的事:
  1. 探測利用 static 欄位定義,在每一個被探測的類別中建立 Date 類型的 static 欄位。靜態欄位是藉由呼叫 new Date(); 而起始設定。
  2. staticInitializer 片段中,只要載入被探測之類別的 Date 實例,探測就會把它設為 "time zero"(1970 年一月)。
  3. entry 片段中,探測會檢查上次何時更新,如果更新是在 1 秒以前執行,則發出報告。(由於目標規則的緣故,entry 片段只在建構子中執行。)
  4. 最後,探測會把 Date 實例的值改為 "now"。

探測會使用 static 欄位定義在每一個被探測的類別中建立新的 static 欄位。相較之下,利用類別範圍的片段來宣告 Date 欄位時,只會在產生的類別(保存探測片段)中產生單一 Date 實例,而不論探測套用至多少個類別。如果您要追蹤在建立任何被探測類別的實例之間(而不是建立每一個被探測的類別實例之間),延遲了多久時間,就可以這麼做。

Probekit 編輯器使用下列項目來定義此探測:
  • static 欄位的完整 Java 類型(在樹狀窗格中用滑鼠右鍵按一下 探測, 再按一下新建 > Static 欄位,輸入這個值):

    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]");