本例將示範如何使用 staticField 資料項目和 StaticInitializer 探針片段。
在本例當中,探針會追蹤類別實例何時建立。 如果在該類別的前一個實例建立之後,超過一秒才建立下一個實例,探針就會撰寫一則日誌訊息。
這個探針是利用 staticField,在每一個被探測的類別中,建立新的靜態欄位。 相較之下,如果利用 fragmentAtClassScope 來宣告「日期」欄位, 在產生的類別(這個類別會保留探針片段)中,只會有一個 Date 實例出現, 不管該探針套用到幾個類別都一樣。 如果您要追蹤在建立任何被探測類別的實例之間(而不是建立每一個被探測的類別實例之間),延遲了多久時間,就可以這麼做。
如果要使用這個程式碼範例,請把目標物件中的 package="com.sample*",改為參照實際的套件名稱。
請注意,如果要在 XML 中使用 & 和 < 字元,必須指定字元實體 & 和 <,如本例所示。
<?xml version="1.0" encoding="ASCII"?>
<probekit>
<probe>
<target type="include" package="com.sample*" method="<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 && prev + 1000 < 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>