13 September 2013

Como acceder a la pila de llamadas de la JVM

Para acceder a la pila de llamadas actual de nuestro código (es decir desde donde se esta invocando) la JVM pone a nuestra disposición el método getStackTrace(), este método nos devuelve la pila de llamadas, esta nos proporciona datos como la clase, método y línea de código desde la cual se esta llamando.

Teniendo la siguiente estructura de proyecto, donde la Clase Demo, utiliza la clase Top y esta la TopNested.
Para que saber desde la clase TopNested desde donde se esta llamando, se invoca el método printStackTrace de la clase StackTracePrinter, el cual tiene el siguiente código:

/**
 * Emmerson: Se imprime la pila de llamadas obviando la clase actual y la del stacktrace.
 * @param args
 */
public static void printStackTrace() {
 StackTraceElement[] stack = Thread.currentThread().getStackTrace();
 for(int pos=stack.length - 1; pos > 1; pos--){
  StackTraceElement elem = stack[pos];
  //se elimina el paquete del nombre de la clase
  String name = elem.getClassName().substring( 
    elem.getClassName().lastIndexOf(".") + 1 );
  System.out.print(name + "." + elem.getMethodName() + ":" 
    + elem.getLineNumber());
  if(pos > 2)System.out.print("->");
 }
}

Como se puede ver en el resultado de la ejecución tenemos que la ejecución a empezado en el método main de la clase Demo, y esta invoca el metodoTop de la clase Top y este el metodoNested de la clase TopNested.


Como se puede ver, esta información es mucho más reducida y concisa que hacer un printStackTrace de un objeto del tipo Throwable, y lo mejor es que no necesitamos de una excepción para poder acceder a esta información.

- FIN -

2 comments:

prietopa said...

Muy bueno, llevaba tiempo queriendo algo asi, y lo tenia muy facil.

Muchas gracias por compartir!!

Emmerson Miranda said...

Ten cuidado de utilizar esta funcionalidad de forma intensiva ya que podría penalizar el rendimiento de tus aplicaciones.