Who is calling me? – Analyzing the Java Callstack

Lucas Jellema 2

During the Spring Workshop, Rod Johnson started a brief discussion on how to find out in a Java Class who invoked the method currently being executed. The best trick: create a new Throwable and inspect the stacktrace. In Java 1.3 you had to use the printstackTrace() method and parse the String, in Java 1.4 there is the StackTraceElement[] that you can inspect. A simple utility class that informs any caller about his own caller could look like this:

public static String whoCalledMe()
	{
		 Throwable t = new Throwable();
		 return t.getStackTrace()[2].toString();
	}

or:

public static Class whoCalledMe()
	{
		 Throwable t = new Throwable();
		 return t.getStackTrace()[2].getClass(); // that is: Class, not Object!
	}

example code:

/*
 * Created on Jun 10, 2005
 *
 */
package nl.amis.util;

/**
 * @author Lucas
 *
 */
public class CallStackUtils {

	public static String whoCalledMe()
	{
		 Throwable t = new Throwable();
		 return t.getStackTrace()[2].toString();
	}

	public String getCall() {
		return whoCalledMe();
	}

	public String inBetween() {
		return getCall();
	}

	public static void main(String[] args) {

		CallStackUtils call = new CallStackUtils();
		System.out.println(call.inBetween());
	}
}

The output of running main is: nl.amis.util.CallStackUtils.inBetween(CallStackUtils.java:24)

Methods on StackTraceElement include: isNativeMethod() getLineNumber() getClass() getMethodName() getFileName() getClassName()

2 thoughts on “Who is calling me? – Analyzing the Java Callstack

Comments are closed.

Next Post

My First AJAX - the simplest Asynchronuous JavaScript Server call man can imagine

Facebook0TwitterLinkedinInspired by Aino’s post AJAX and RIA, I wanted to get my first XMLHttpRequest object based AJAX example getting up and running. It is a standalone HTML page that can be deployed on any webserver (I ran it from inside JDeveloper). When the Submit button is pressed, the page itself […]