Get the Java callstack anytime

I’m working on a somewhat complicated Java web application that has evolved over a number of years. As usual, evolution has resulted in the code getting a bit unwieldy. I needed to get the details of the call stack in various places so I could determine (at runtime) where a method was called from. To accomplish that, I developed this class:


package com.purplewasp.util;

import java.util.ArrayList;

public class CallStackUtil {

  public synchronized static String getCallStackAsString() {
    StringBuilder sb = new StringBuilder();

    StackTraceElement[] stackTraceElements = 
      Thread.currentThread().getStackTrace();
    
    String[] array = getCallStackAsStringArray(stackTraceElements);
    
    for (int i = 0; i < array.length; i++) {
      sb.append(array[i"\n");
    }
    return sb.toString();
  }

  public synchronized static String[] getCallStackAsStringArray() {
    StackTraceElement[] stackTraceElements = 
      Thread.currentThread().getStackTrace();
    
    String[] array = getCallStackAsStringArray(stackTraceElements);
    
    return array;
  }

  private synchronized static String[] getCallStackAsStringArray(StackTraceElement[] stackTraceElements) {
    ArrayList<String> list = new ArrayList<String>();
    String[] array = new String[1];

    for (int i = 0; i < stackTraceElements.length; i++) {
      StackTraceElement element = stackTraceElements[i];
      String classname = element.getClassName();
      String methodName = element.getMethodName();
      int lineNumber = element.getLineNumber();
      list.add(classname + "." + methodName + ":" + lineNumber);
    }
    return list.toArray(array);
  }

}

0 comments ↓

There are no comments yet...Kick things off by filling out the form below.