Um Exemplo de Probe staticField e staticInitializer

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

No exemplo, o probe mantém a controle de 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, o probe gravará uma mensagem de registro.

A seguir está o que o probe faz:
  1. Utilizando a definição do campo estático, o probe cria um campo estático de tipo Date em cada classe com probe. O campo estático será inicializado chamando new Date();.
  2. No fragmento staticInitializer, o probe define a instância Data de uma classe com probe para "hora zero" (Janeiro de 1970) quando é carregado.
  3. No fragmento entry, o probe verifica quando a atualização anterior foi executada e emitirá um relatório se a atualização foi executada há mais de um segundo. (Por causa das regras de destino, o fragmento entry é executado apenas em construtores).
  4. Finalmente, o probe atualiza o valor da instância Data para "agora."

O probe utiliza a definição do campo estático para criar um novo campo estático em cada classe com probe. Em comparação, o uso de um fragmento no escopo de classe para declarar o campo Data resulta em uma instância única de Data que aparece na classe gerada que mantém os fragmentos de probe, não importando para quantas classes o probe é aplicado. 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.

Esse probe é definido pelas seguintes entradas no editor Probekit:
  • Tipo de Java completo para campo estático (clique com o botão direito do mouse em Probe na área de janela da árvore e clique em Novo > Campo Estático para digitar este valor):

    java.util.Date

  • Destino (para digitar esses valores, selecione Destino na área de janela da árvore e clique em Editar):
    • Tipo de Destino: incluir
    • Pacote: com.sample* (Utilize um nome de pacote real aqui.)
    • Classe: *
    • Método: <init>
    • Assinatura do Método: *
  • Destino (para digitar esses valores, clique em Incluir e em Editar na área de janela Editar):
    • Tipo de Destino: excluir
    • Pacote: *
    • Classe: *
    • Método: *
    • Assinatura do Método: *
  • Fragmento (selecione Fragmento na área de janela da árvore para digitar esses valores):
    • Tipo de Fragmento: entrada
    • Itens de Dados:
      • Tipo de Dados: staticField, Nome: lastInstanceDate
      • Tipo de Dados: className, Nome: 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 (clique com o botão direito do mouse em Probe e selecione Novo > Fragmento para digitar estes valores):
      • Tipo de Fragmento: staticInitializer
      • Itens de Dados:
        • Tipo de Dados: staticField, Nome: lastInstanceDate
        • Tipo de Dados: className, Nome: clname
      • Código Java:

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