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》