本示例说明了 staticField 数据项和 StaticInitializer 探测片段的使用。
在该示例中,探测保持跟踪类的实例的创建时间。如果在该类的前一个实例之后多于一秒的时间后才创建实例,则探测将写入一条日志消息。
该探测使用 staticField 在每个探测的类中创建一个新的静态字段。通过比较,使用 fragmentAtClassScope 声明 Date 字段将导致 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>