Who is calling me? – Analyzing the Java Callstack

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()

Share.

About Author

Lucas Jellema, active in IT (and with Oracle) since 1994. Oracle ACE Director for Fusion Middleware. Consultant, trainer and instructor on diverse areas including Oracle Database (SQL & PLSQL), Service Oriented Architecture, BPM, ADF, Java in various shapes and forms and many other things. Author of the Oracle Press book: Oracle SOA Suite 11g Handbook. Frequent presenter on conferences such as JavaOne, Oracle OpenWorld, ODTUG Kaleidoscope, Devoxx and OBUG. Presenter for Oracle University Celebrity specials.

2 Comments