Ejemplo de sonda staticField y staticInitializer

Este ejemplo muestra cómo utilizar el elemento de datos staticField y el fragmento de sonda staticInitializer.

En este ejemplo, la sonda hace un seguimiento de cuándo se crean las instancias de una clase. Si una instancia se crea después de más de un segundo de la instancia anterior de dicha clase, la sonda escribe un mensaje de anotaciones.

Esta sonda hace lo siguiente:
  1. Utilizando la definición de campo estático, la sonda crea un campo estático de tipo Date en cada clase sondeada. El campo estático se inicializará llamando a new Date();.
  2. En el fragmento staticInitializer, la sonda establece la instancia Date de una clase sondeada a la "hora cero" (Enero de 1970) cuando se carga.
  3. En el fragmento entry, la sonda comprueba cuándo se ha realizado la actualización anterior y emite un informe si la actualización se ha realizado hace más de un segundo. (Debido a las normas de destino, el fragmento entry sólo se ejecuta en constructores).
  4. Finalmente, la sonda actualiza el valor de la instancia Date a "now" (ahora).

La sonda utiliza la definición de campo estático para crear un nuevo campo estático en cada clase sondeada. Por comparación, la utilización de un fragmento en el ámbito de clase para declarar el campo Date daría como resultado una única instancia de Date que aparece en la clase generada que contiene los fragmentos de sonda, sea cual sea el número de clases a las que se aplica la sonda. Puede hacerlo si desea hacer un seguimiento del retardo entre la creación de instancias de cualquier clase sondeada, en lugar de hacer un seguimiento del retardo entre la creación de instancias de cada clase sondeada.

Esta sonda se define mediante las siguientes entradas en el editor de Probekit:
  • Tipo Java totalmente calificado para campo estático (pulse Sonda con el botón derecho del ratón en el panel de árbol y pulse Nuevo > Campo estático para especificar este valor):

    java.util.Date

  • Destino (para especificar estos valores, seleccione Destino en el panel de árbol y pulse Editar):
    • Tipo destino: include
    • Paquete: com.sample* (aquí debe utilizar un nombre de paquete real).
    • Clase: *
    • Método: <init>
    • Signatura de método: *
  • Destino (para especificar estos valores, pulse Añadir y luego Editar en el panel de árbol):
    • Tipo destino: exclude
    • Paquete: *
    • Clase: *
    • Método: *
    • Signatura de método: *
  • Fragmento (seleccione Fragmento en el panel de árbol para especificar estos valores):
    • Tipo de fragmento: entry
    • Elementos de datos:
      • Tipo de datos: staticField, Nombre: lastInstanceDate
      • Tipo de datos: className, Nombre: 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 + " instancia después de > 1 segundo]");
      }
      lastInstanceDate.setTime(now);

    • Fragmento (pulse Sonda con el botón derecho del ratón y seleccione Nuevo > Fragmento para especificar estos valores):
      • Tipo de fragmento: staticInitializer
      • Elementos de datos:
        • Tipo de datos: staticField, Nombre: lastInstanceDate
        • Tipo de datos: className, Nombre: clname
      • Código Java:

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