Der aktuelle Stacktrace kann in Java ganz einfach mit
Thread.currentThread().getStackTrace(); ermittelt werden. Doch darin enthalten ist dann auch die Methode getStackTrace() selbst.
Diese kleine Hilfklasse schneidet diesen irrelvanten Teil des Stacktraces ab:
/// convenience class to access the current stack trace
public class StackTrace {
private static final int classLen = "class".length();
private static final String clazz =
StackTrace.class.toString().substring(classLen+1);
private StackTraceElement[] stack;
private int offset;
/// takes a snapshot of the current stack trace
public StackTrace() {
stack = Thread.currentThread().getStackTrace();
offset = 0;
while ( !clazz.equals(stack[offset].getClassName()) ) {
++offset;
}
while ( clazz.equals(stack[offset].getClassName()) ) {
++offset;
}
}
/** returns the n-th stack trace element,
only counting frames above this class itself **/
public StackTraceElement getStackTrace(int n) {
return stack[n+offset];
}
}
Verwendet wird die Klasse, wie in folgendem kleinen JUnit Test dargestellt:
import org.junit.Test;
import static org.junit.Assert.*;
public class StackTraceTest {
@Test
public void getStackTraceTest() {
test1();
}
private static void test1() {
test2();
}
private static void test2() {
StackTrace trace = new StackTrace();
StackTraceElement frame0 = trace.getStackTrace(0);
assertEquals( "test2", frame0.getMethodName().toString() );
StackTraceElement frame1 = trace.getStackTrace(1);
assertEquals( "test1", frame1.getMethodName().toString() );
}
}
Twitter
Facebook
Reddit
LinkedIn
StumbleUpon
Email