Java的函数调用栈就是Java虚拟机栈,它是线程私有的,与线程一同被创建,用于存储栈帧。
栈帧随着方法的调用而创建,随着方法的结束而销毁。可以说栈帧是方法的抽象。
于是,可以通过打印出Java虚拟机栈中的栈帧信息来了解函数调用过程。用于实现这个过程的Java代码如下:
package methodcall; public class Methods { public void method1() { method2(); } public void method2() { method3(); } public void method3() { Throwable ex = new Throwable(); /** * Throwable的getStackTrace()可以返回当前线程的虚拟机栈信息,返回 * 数组的第一个元素是栈顶元素,最后一个元素是栈底元素。 */ StackTraceElement[] stackElements = ex.getStackTrace(); System.out.println(stackElements.length); for (StackTraceElement stackTraceElement : stackElements) { System.out.println(stackTraceElement.getMethodName()); } } }
package methodcall; public class MethodCall { public static void main(String[] args) { // TODO Auto-generated method stub Methods methods = new Methods(); methods.method1(); } }
输出结果如下:
4
method3
method2
method1
main
参考文献:
《Java虚拟机规范 Java SE 7》