Exemplo de staticField e staticInitializer

Este exemplo demonstra o uso do item de dados staticField e do fragmento probe StaticInitializer.

Neste exemplo, uma probe acompanha quando as instâncias de uma classe são criadas. Se uma instância for criada mais de um segundo após a instância anterior daquela classe, a probe gravará uma mensagem de log.

A seguir está o que a probe faz:
  1. Utilizando o item de dados staticField, a probe cria um campo estático do tipo Date em cada classe sondada. O campo estático será inicializado chamando new Date();.
  2. No fragmento staticInitializer, a probe define a instância Data de uma classe sondada para "hora zero" (Janeiro de 1970) quando é carregada.
  3. No fragmento entry (devido às regras de destino, o fragmento entry é executado apenas em construtores), a probe verifica quando a atualização anterior foi executada e emite um relatório se a atualização tiver sido executada mais de um segundo atrás.
  4. Finalmente, a probe atualiza o valor da instância Data para "agora."

Essa probe utiliza staticField para criar um novo campo estático em cada classe sondada. Em comparação, utilizar fragmentAtClassScope para declarar o campo Data resultará em uma única instância de Data aparecendo na classe gerada que contém os fragmentos probe, independente de quantas classes a probe se aplica. Você poderá fazer isso se desejar rastrear o retardo de tempo entre a criação de instâncias de qualquer classe sondada, em vez de rastrear o retardo entre a criação de instâncias de cada classe sondada.

Para utilizar esse código de exemplo, altere package="com.sample*" no objeto de destino para que se refira a um nome de pacote real.

Observe que para utilizar os caracteres & e < em XML, você deve especificar as entidades dos caracteres &amp; e &lt;, conforme mostrado no exemplo.

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

Tópico-pai: Referência do Kit Probe

Referência Relacionada
O Objeto Probe StaticField
Fragmento Probe staticInitializer

Copyright IBM Corporation e outros 2000, 2004.