Exemple de staticField et de staticInitializer

Cet exemple illustre l'utilisation de l'élément de données staticField et du fragment de sonde StaticInitializer.

Dans cet exemple, une sonde garde la trace de la création des instances d'une classe. Si une instance est créée plus d'une seconde après l'instance précédente de cette classe, la sonde rédige un message de journal.

Voici un exemple des actions de cette sonde :
  1. A l'aide de l'élément de données staticField, la sonde crée un champ statique du type Date dans chaque classe à sonde. Le champ statique sera initialisé par un appel à new Date();.
  2. Dans le fragment staticInitializer, la sonde définit l'instance Date d'une classe à sonde sur "temps zéro" (janvier 1970) lorsqu'elle est chargée.
  3. Dans le fragment entry (en raison des règles de cible, le fragment entry n'est exécuté que dans les constructeurs), la sonde contrôle la date de la précécente mise à jour et émet un rapport si la mise à jour a été réalisée plus d'une seconde auparavant.
  4. Enfin, la sonde met à jour la valeur de l'instance Date sur "maintenant".

Cette sonde utilise staticField pour créer un nouveau champ statique dans chaque classe à sonde. En comparaison, l'utilisation de fragmentAtClassScope pour déclarer le champ Date entraînerait une seule instance de Date apparaissant dans la classe générée qui contient les fragments de sonde, quel que soit le nombre de classes auxquelles la sonde est appliquée. Vous pouvez appliquer cette méthode si vous souhaitez suivre le retard pris dans la création des instances d'une quelconque classe à sonde, plutôt que le retard pris dans la création des instances de chaque classe à sonde.

Pour utiliser cet exemple de code, changez package="com.sample*" dans l'objet cible pour indiquer un nom de module réel.

Notez que pour utiliser les caractères & et < en XML, vous devez spécifier les entités de caractère &amp; et &lt;, comme indiqué 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 + d'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>

Sujet parent : Exemples de Probekit

Référence associée
L'objet de sonde StaticField
Le fragment de sonde staticInitializer

Conditions d'utilisation | Commentaires
(C) Copyright IBM Corporation 2004. All Rights Reserved.