staticField 和 staticInitializer 範例

本例將示範如何使用 staticField 資料項目和 StaticInitializer 探針片段。

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

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

這個探針是利用 staticField,在每一個被探測的類別中,建立新的靜態欄位。 相較之下,如果利用 fragmentAtClassScope 來宣告「日期」欄位, 在產生的類別(這個類別會保留探針片段)中,只會有一個 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 探針片段

Copyright IBM Corporation and others 2000, 2004.