staticField 和 staticInitializer 範例

這個範例示範 staticField 資料項目和 StaticInitializer 探針片段的使用。

在此範例中,探針不斷地追蹤類別實例的建立時間。如果在該類別的前一個實例之後超過一秒才建立另一個實例,則探針會寫入日誌訊息。

以下是探針執行的動作:
  1. 利用 staticField 資料項目,探針在每個探測類別中建立 Date 類型的靜態欄位。靜態欄位將利用呼叫 new Date(); 來起始設定。
  2. staticInitializer 片段中,探針將探測類別的 Date 實例於載入時設為「零時」(1970 年 1 月)。
  3. entry 片段中(因為目標規則,entry 片段只會在建構子中執行),探針會檢查上一次更新是在何時執行,如果更新是在超過 1 秒之前執行,則會發出報告。
  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 探針片段

Terms of use | Feedback
(C) Copyright IBM Corporation 2000, 2004. All Rights Reserved.