Beispiel für 'staticField' und 'staticInitializer'

Dieses Beispiel veranschaulicht die Verwendung des Datenfeldes staticField und des Sondenfragments StaticInitializer.

In diesem Beispiel verfolgt eine Sonde, wann Instanzen einer Klasse erstellt werden. Liegt zwischen der Erstellung einer Instanz und der Erstellung der vorherigen Instanz dieser Klasse mehr als eine Sekunde, schreibt die Sonde eine Protokollnachricht.

Diese Sonde führt die folgenden Schritte aus:
  1. Mit dem Datenfeld staticField erstellt die Sonde in jeder instrumentierten Klasse ein statisches Feld des Typs Date. Das statische Feld wird durch den Aufruf von new Date(); initialisiert.
  2. Im staticInitializer-Fragment setzt die Sonde die Date-Instanz einer instrumentierten Klasse auf "time zero" (January, 1970), wenn die Klasse geladen wird.
  3. Im Fragment des Typs entry (das wegen der Zielregeln nur in Konstruktoren ausgeführt wird) prüft die Sonde, wann das vorherige Update durchgeführt wurde, und setzt eine Bericht ab, falls das letzte Update mehr als eine Sekunde zurückliegt.
  4. Schließlich aktualisiert die Sonde den Wert der Date-Instanz und setzt ihn auf "now".

Die Sonde erstellt mit staticField in jeder instrumentierten Klasse ein neues statisches Feld. Im Vergleich dazu führt die Deklaration des Date-Feldes mit fragmentAtClassScope unabhängig von der Anzahl der Klassen, auf die die Sonde angewendet wird, zu nur einer Date-Instanz in der generierten Klasse, die die Sondenfragmente enthält. Diese Methode ist geeignet, wenn die Zeitverzögerung zwischen der Erstellung der Instanzen aller instrumentierten Klassen verfolgt werden soll und nicht die Verzögerung zwischen der Erstellung der Instanzen für jede einzelne instrumentierte Klasse.

Zur Verwendung dieses Beispielcodes müssen Sie package="com.sample*" im Target-Objekt so ändern, dass das Objekt auf den Namen eines tatsächlichen Pakets verweist.

Wenn Sie in XML die Zeichen & und < verwenden möchten, müssen Sie wie im Beispiel die Zeichenentitäten &amp; und &lt; angeben.

<?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>

Übergeordnetes Thema: Probekit-Beispiele

Zugehörige Verweise
Sondenobjekt 'StaticField'
Sondenfragment 'staticInitializer'

Nutzungsbedingungen | Feedback
(C) Copyright IBM Corporation 2004. Alle Rechte vorbehalten.