当你维护别人的代码时候,会发现某个方法被代码多处调用,如果你想知道该方法是从那一个方法调用过来的,可以在这个方法中打印该方法在程序运行时栈中的调用顺序。
代码片段如下:
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.UnknownHostException;
/**
* 打印Java某个方法的调用栈信息
*/
public class TestForStack {
public static void main(String[] args) {
//测试例子,f方法最后会调用到a方法而打印输出信息
new TestForStack().f();
}
/**
* 打印a方法调用的栈信息,即是从那个方法调用开始调用到了a方法
*/
private void a() {
Throwable t = new Throwable();
t.fillInStackTrace();
System.out.println(getStackTraceString(t));
}
private void b() {
a();
}
private void c() {
b();
}
private void d() {
c();
}
private void e() {
d();
}
private void f() {
e();
}
public static String getStackTraceString(Throwable tr) {
if (tr == null) {
return "";
}
Throwable t = tr;
while (t != null) {
if (t instanceof UnknownHostException) {
return "";
}
t = t.getCause();
}
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
tr.printStackTrace(pw);
return sw.toString();
}
}
程序中打印了方法a()在程序运行中的调用顺序,结果显示调用的顺序是从下而上,运行结果如下:
java.lang.Throwable
at TestForStack.a(TestForStack.java:20)
at TestForStack.b(TestForStack.java:25)
at TestForStack.c(TestForStack.java:29)
at TestForStack.d(TestForStack.java:33)
at TestForStack.e(TestForStack.java:37)
at TestForStack.f(TestForStack.java:41)
at TestForStack.main(TestForStack.java:12)