Exemple staticField et staticInitializer

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

Dans cet exemple, un composant d'analyse 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, le composant d'analyse écrit un message dans le journal.

Voici l'action du composant d'analyse :
  1. A l'aide de l'élément de données staticField, le composant d'analyse crée une zone statique de type Date dans chaque classe analysée. Cette zone statique est alors initialisée en appelant new Date();.
  2. Dans le fragment staticInitializer, le composant d'analyse définit l'instance Date d'une classe analysé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), le composant d'analyse 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, le composant d'analyse met à jour la valeur de l'instance Date qui passe à "maintenant".

Cet composant d'analyse utilise staticField pour créer une zone statique dans chaque classe analysé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 d'analyse, quel que soit le nombre de classes auxquelles le composant d'analyse s'applique. Vous pouvez procéder de la sorte pour suivre le délai entre la création d'instances d'une classe analysé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 au 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 d'analyse StaticField
Fragment d'analyse staticInitializer

Copyright IBM Corporation et autres 2000, 2004.