前言

实际开发中,有多个接个有多个实现类时,搞不清调用栈,可以用这个方法来查看。

实现

实现方式,通过拿到当前线程的所有调用栈信息,再遍历输出即可,虽然简单吧,但是实用呀,有时候一个方法报错了,没有异常调用栈,就比较难受了,加上这个方法,自己打调用栈。

获取方法调用栈方式:

1
Thread.currentThread().getStackTrace();

代码比较简单,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Test {

public static void main(String[] args) {
//打印所有调用栈
testInvoke();
}

public static void testInvoke() {
defaultTag();
}

private static String defaultTag() {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
for (StackTraceElement e : stackTrace) {
System.out.println(e.getClassName() + "\t"
+ e.getMethodName() + "\t行号: " + e.getLineNumber());
}
StackTraceElement log = stackTrace[1];
String tag = null;
for (int i = 1; i < stackTrace.length; i++) {
StackTraceElement e = stackTrace[i];
if (!e.getClassName().equals(log.getClassName())) {
tag = e.getClassName() + "." + e.getMethodName();
break;
}
}
if (tag == null) {
tag = log.getClassName() + "." + log.getMethodName();
}
System.out.println("当前方法: " + tag);
return tag;
}

}

结果

1
2
3
4
5
java.lang.Thread	getStackTrace	行号: 1559
Test defaultTag 行号: 17
Test testInvoke 行号: 13
Test main 行号: 8
当前方法: Test.defaultTag