Las herramientas de cobertura y perfilado emplean principalmente dos técnicas: sondear periódicamente la JVM para el estado de varios subprocesos o instrumentar el bytecode de la aplicación para expulsar de los datos relevantes de JVM.
No hay soporte para la API directa en el propio lenguaje Java, sin embargo hay muchas herramientas que puede explotar:
- Usted puede coger el hilo vertederos, utilizando jstack o herramientas similares, les ahorrará Toa archivo, a continuación, analizar (o escriba un script/programa para analizar), esto es un sondeo.
- Use ASM o BCEL para modificar el bytecode de su aplicación, esto es push pero es muy difícil de hacer.
- Utilice AspectJ, utilizando el agente de tejido de tiempo de carga, es solo un parámetro de línea de comando para habilitarlo.
La solución 3 es mucho más fácil, limpia y versátil.
Para imprimir, en tiempo de ejecución, cualquiera que sea el método que se denomina como consecuencia de la ejecución de un método es un aspecto trazado sencillo, algo similar a:
public aspect TraceCalls {
pointcut aCall : call(* *(..));
pointcut inside : cflow(execution(public MyClass.MyMethod(..)));
before() : aCall() && inside() {
System.out.println(thisJoinPoint);
}
}
Obviamente, se puede acceder a muchos más datos, imprimir en un archivo, darle formato, etc ...
(Tenga en cuenta que he escrito este código aquí, por lo que podría estar lleno de errores de sintaxis)