共计 1103 个字符,预计需要花费 3 分钟才能阅读完成。
一、调用栈
调用链监控仅仅获取调用顺序是不够的,如前所描述:
左边只体现了顺序,右边体现了顺序和调用栈信息。
二、获取调用栈
在 Java 中获取调用栈的方法如下:
Thread.currentThread().getStackTrace()
代码示例:
public class Man {public static void main(String[] args) {Man man = new Man();
man.getup();
man.brushTeeth();
man.eat();}
public void getup() {System.out.println("getup");
}
public void brushTeeth() {System.out.println("brush teeth");
}
public void eat() {StackTraceElement[] elements = Thread.currentThread().getStackTrace();
for (int i = 0; i < elements.length; i++) {StringBuffer buffer = new StringBuffer();
buffer.append("index:").append(i).append("ClassName:").append(elements[i].getClassName())
.append("Method Name :" + elements[i].getMethodName());
System.out.println(buffer.toString());
}
System.out.println("eat");
}
}
输出结果:
getup
brush teeth
index: 0 ClassName: java.lang.Thread Method Name : getStackTrace
index: 1 ClassName: com.javashizhan.demo.Man Method Name : eat
index: 2 ClassName: com.javashizhan.demo.Man Method Name : main
eat
可以看到第 3 个栈是调用 eat 的方法。
三、注意事项
在实际代码中需要注意:
- 并不一定是第 3 个栈就是当前方法的父方法,如在 spring 中调用还会有其他父方法,这个数字大于 3。
- 一次调用过程中有的方法可能被循环调用导致有多个同名方法,因此通过类名和方法名并不一定就能准确找到对应的父方法,应查找调用链上最近的一个同名方法。
end.
微信公众号:
加入《Java 栈实战营》知识星球,参与讨论,更多实战代码分享!
https://t.zsxq.com/RNzfi2j
正文完
发表至: java
2019-08-06