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

About Author

Lucas Jellema, active in IT (and with Oracle) since 1994. Oracle ACE Director and Oracle Developer Champion. Solution architect and developer on diverse areas including SQL, JavaScript, Docker, Machine Learning, Java, SOA and microservices, events in various shapes and forms and many other things. Author of the Oracle Press books: Oracle SOA Suite 11g Handbook and Oracle SOA Suite 12c Handbook. Frequent presenter on community events and conferences such as JavaOne, Oracle Code and Oracle OpenWorld.

2 Comments