Exemple de sonde 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. Grâce à la définition de champ statique, la sonde crée un champ statique de type Date dans chaque classe sondée. Ce champ statique est alors initialisé 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, la sonde vérifie la date de la mise à jour précédente, et rédige un rapport si cette mise à jour remonte à plus d'une seconde. (A cause des règles de la cible, le fragment entry ne fonctionne que dans les constructeurs.)
  4. Enfin, la sonde met à jour la valeur de l'instance Date qui passe à "maintenant".

La sonde utilise une définition de champ statique pour créer un nouveau champ statique dans chaque classe sondée. Par comparaison, utiliser une étendue de fragment de classe pour déclarer le champ Date ne ferait apparaître qu'une seule instance de Date dans la classe générée qui détient les fragments, quel que soit le nombre de classes auxquelles la sonde est appliquée. 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.

Cette sonde est définie dans l'éditeur Probekit par les entrées suivantes :
  • Type Java entièrement qualifié pour champ statique (clic droit sur Sonde dans le panneau d'arborescence, puis clic sur Nouveau > Champ statique pour entrer cette valeur) :

    java.util.Date

  • Cible (pour entrer ces valeurs, sélectionnez Cible dans le panneau d'arborescence, puis cliquez sur Editer) :
    • Type de cible : include
    • Module: com.sample* (Utilisez un nom de package ici.)
    • Classe: *
    • Méthode: <init>
    • Signature de méthode: *
  • Cible (pour entrer ces valeurs, cliquez sur Ajouter, puis sur Editer dans le panneau d'édition) :
    • Type de cible : exclude
    • Module: *
    • Classe: *
    • Méthode: *
    • Signature de méthode: *
  • Fragment (sélectionnez Fragment dans le panneau d'arborescence pour entrer ces valeurs) :
    • Type de fragment : entry
    • Elements de données :
      • Type de données : Nom de classe, Nom : lastInstanceDate
      • Type de données : Nom de classe, Nom : clname
    • Code Java :

      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);

    • Fragment (clic droit sur Sonde et clic sur Nouveau > Fragment pour entrer ces valeurs) :
      • Type de fragment : staticInitializer
      • Elements de données :
        • Type de données : Nom de classe, Nom : lastInstanceDate
        • Type de données : Nom de classe, Nom : clname
      • Code Java :

                 lastInstanceDate.setTime(0);
                 System.out.println("[" + clname + " class loaded]");