Exemplo de sonda staticField e staticInitializer

Este exemplo demonstra a utilização do artigo de dados staticField e do fragmento de sonda staticInitializer.

No exemplo, a sonda mantém registo do momento de criação de instâncias de uma classe. Se uma instância for criada mais de um segundo após a instância anterior dessa classe, a sonda escreve uma mensagem no ficheiro de registo.

Eis o que esta sonda realiza:
  1. Com a definição de campo estático, a sonda cria um campo estático do tipo Data em cada classe sondada. O campo estático será inicializado chamando new Date();.
  2. No fragmento staticInitializer, a sonda define a instância de Data de uma classe sondada como "hora zero" (Janeiro de 1970) quando for carregada.
  3. No fragmento de entrada, a sonda verifica se foi efectuada a actualização anterior, e emite um relatório se esta tiver sido efectuada há mais de um segundo. (Dadas as regras de destino, o fragmento de entrada só é executado em construtores.)
  4. Por fim, a sonda actualiza o valor da instância de Data, passando a ser "agora".

A sonda utiliza a definição do campo estático para criar um novo campo estático em cada classe sondada. Comparativamente, ao utilizar um fragmento no âmbito da classe para declarar o campo Data resultaria numa única instância de Data a aparecer na classe gerada que retém os fragmentos de sonda, sejam quantas forem as classes a que a sonda está aplicada. Poderá optar por esta hipótese se quiser acompanhar o diferimento entre a criação de instâncias de qualquer classe sondada, em vez de acompanhar o diferimento entre a criação de instâncias de cada classe sondada.

Esta sonda define-se pelas seguintes entradas no editor do Probekit:
  • Tipo totalmente qualificado Java para campo estático (faça clique com o botão direito do rato em Sonda na área de janela em árvore e depois faça clique em Novo(a) > Campo Estático para introduzir este valor):

    java.util.Date

  • Destino (para introduzir estes valores, seleccione Destino na área de janela em árvore e depois faça clique em Editar):
    • Tipo de Destino: include
    • Pacote: com.sample* (Utilize um verdadeiro nome de pacote aqui.)
    • Classe: *
    • Método: <init>
    • Assinatura do Método: *
  • Destino (para introduzir estes valores, faça clique em Adicionar e depois em Editar na área de janela de edição):
    • Tipo de Destino: exclude
    • Pacote: *
    • Classe: *
    • Método: *
    • Assinatura do Método: *
  • Fragmento (seleccione Fragmento na área de janela em árvore para introduzir estes valores):
    • Tipo de Fragmento: entry
    • Artigos de Dados:
      • Tipo de Dados: staticField, Name: lastInstanceDate
      • Tipo de Dados: className, Name: clname
    • Código 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);

    • Fragmento (faça clique com o botão direito do rato em Sonda e em Novo(a) > Fragmento para introduzir estes valores):
      • Tipo de Fragmento: staticInitializer
      • Artigos de Dados:
        • Tipo de Dados: staticField, Name: lastInstanceDate
        • Tipo de Dados: className, Name: clname
      • Código Java:

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