Exemple staticField et staticInitializer

Cet exemple montre comment utiliser l'élément de données staticField et le fragment de sonde StaticInitializer.

Dans cet exemple, une sonde effectue le suivi de la création d'instances pour une classe. Si une instance est créée plus d'une seconde après la précédente de cette classe, la sonde écrit un message dans le journal.

Voici l'action de la sonde :
  1. A l'aide de l'élément de données staticField, la sonde crée une zone statique de type Date dans chaque classe sondée. Cette zone statique est alors initialisée en appelant new Date();.
  2. Dans le fragment staticInitializer, la sonde définit l'instance Date d'une classe sondée comme "temps zéro" (janvier 1970) à son chargement.
  3. Dans le fragment entry (en raison des règles cible, le fragment entry s'exécute uniquement dans des constructeurs), la sonde vérifie quand la précédente mise à jour a eu lieu et émet un rapport si elle remonte à plus d'une seconde.
  4. Enfin, la sonde met à jour la valeur de l'instance Date qui passe à "maintenant".

Cette sonde utilise staticField pour créer une zone statique dans chaque classe sondée. Par comparaison, l'utilisation de fragmentAtClassScope pour déclarer la zone Date fait apparaître une instance Date dans la classe générée qui contient les fragments de sonde, quel que soit le nombre de classes auxquelles la sonde s'applique. Vous pouvez procéder de la sorte pour suivre le délai entre la création d'instances d'une classe sondée au lieu de chacune d'elles.

Pour employer cet exemple de code, modifiez package="com.sample*" dans l'objet cible afin de faire référence à un nom de package réel.

Pour utiliser les caractères & et < dans XML, vous devez indiquer les entités de caractères &amp; et &lt;, comme illustré dans l'exemple :

<?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 après > 1 seconde]"); } lastInstanceDate.setTime(now);
       </code>
    </fragment>
    <fragment type="staticInitializer">
      <data name="lastInstanceDate" type="staticField"/>
      <data name="clname"/>
      <code>
         lastInstanceDate.setTime(0);
         System.out.println("[" + clname + " classe chargée]");
      </code>
    </fragment>
  </probe>
</probekit>

Rubrique parent : Exemples Probekit

Référence associée
Objet de sonde StaticField
Le fragment de sonde staticInitializer

Copyright IBM Corporation et autres 2000, 2004.