Esempio di staticField e staticInitializer

In questo esempio viene mostrato l'uso dell'elemento di dati staticField e del frammento di analisi StaticInitializer.

In questo esempio, un'analisi tiene traccia del momento in cui le istanze di una classe vengono create. Se un'istanza viene creata più di un secondo dopo l'istanza precedente di tale classe, l'analisi scrive un messaggio di registrazione.

Di seguito viene riportata l'esecuzione di questa analisi:
  1. Utilizzando l'elemento di dati staticField, l'analisi crea un campo statico di tipo Date in ogni classe analizzata. Il campo statico verrà inizializzato richiamando new Date();.
  2. Nel frammento staticInitializer, l'analisi imposta l'istanza Date di una classe analizzata a "zero" (Gennaio, 1970) quando viene caricata.
  3. Nel frammento entry (a causa delle regole di destinazione, il frammento entry viene eseguito solo nei costruttori), l'analisi verifica quando è stato eseguito l'aggiornamento precedente e segnala se l'aggiornamento è stato eseguito più di un secondo prima.
  4. Infine, l'analisi aggiorna il valore dell'istanza Date in "now".

Questa analisi utilizza staticField per creare un nuovo campo statico in ogni classe analizzata. Mentre, utilizzando fragmentAtClassScope per dichiarare il campo Date dovrebbe creare una singola istanza di Date che appare nella classe generata che contiene i frammenti dell'analisi, a prescindere dal numero di classi alle quali viene applicata l'analisi. È possibile effettuare questa operazione se si desidera tenere traccia del ritardo tra la creazione delle istanze di qualsiasi classe analizzata invece del ritardo tra la creazione delle istanze di ogni classe analizzata.

Per utilizzare questo codice di esempio, modificare package="com.sample*" nell'oggetto di destinazione in modo che faccia riferimento al nome di un pacchetto effettivo.

Tenere presente che per utilizzare i caratteri & e < in XML, è necessario specificare le entità di carattere &amp; e &lt;, come indicato nell'esempio.

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

Argomento principale: Esempi Probekit

Riferimenti correlati
Oggetto di analisi StaticField
Frammento di analisi staticInitializer

Clausole di utilizzo | Commenti
(C) Copyright IBM Corporation 2000, 2004. Tutti i diritti riservati.