转载

Java调用链跟踪关键技术(五)获取调用栈

一、调用栈

调用链监控仅仅获取调用顺序是不够的,如前所描述:

Java调用链跟踪关键技术(五)获取调用栈

左边只体现了顺序,右边体现了顺序和调用栈信息。

二、获取调用栈

在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的方法。

三、注意事项

在实际代码中需要注意:

  1. 并不一定是第3个栈就是当前方法的父方法,如在spring中调用还会有其他父方法,这个数字大于3。
  2. 一次调用过程中有的方法可能被循环调用导致有多个同名方法,因此通过类名和方法名并不一定就能准确找到对应的父方法,应查找调用链上最近的一个同名方法。

end.

<font color="#F4B183">加入《Java栈实战营》知识星球,参与讨论,更多实战代码分享,不就是几斤苹果,几个荣耀道具的事吗! </font>

https://t.zsxq.com/RNzfi2j

Java调用链跟踪关键技术(五)获取调用栈

原文  https://segmentfault.com/a/1190000019980395
正文到此结束
Loading...