本例將示範如何使用 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>