zoukankan      html  css  js  c++  java
  • Java——通过线程堆栈信息获取方法调用者的类名或方法名

    需求:当出现异常时为了获取出现异常的位置并保存当前方法的调用者的类名或方法名记入日志

    技术实现:通过堆栈信息实现。得到的堆栈信息是一个数组,数组角标从0到逐渐增大,最大的是栈顶。

    案例代码:对比总结如下,代码中是若干实现与输出结果中间的差别

    package com.jhy.getStackTraceDemo;
    
    import java.util.Map;
    
    public class DemoTest {
    
        public static void main(String[] args) {
            DemoTest demo = new DemoTest();
            demo.testOne();
            System.out.println("++++++++++++++++++++++++++++++++");
            demo.testTwo();
            System.out.println("++++++++++++++++++++++++++++++++");
            demo.testThree();
        }
    
        /**
         * 借助getAllStackTraces
         */
        public void testOne() {
            StackTraceElement[] stackTraceElement = Thread.getAllStackTraces().get(Thread.currentThread());
            for (int i = 0; i < stackTraceElement.length; i++) {
                System.out.println(Thread.currentThread().getName() + "::::::" + stackTraceElement[i].getClassName() + "."
                        + stackTraceElement[i].getMethodName());
            }
        }
    
        /**
         * 借助currentThread()
         */
        public void testTwo() {
            StackTraceElement[] stackTraceElement = Thread.currentThread().getStackTrace();
            for (int i = 0; i < stackTraceElement.length; i++) {
                System.out.println(Thread.currentThread().getName() + "::::::" + stackTraceElement[i].getClassName() + "."
                        + stackTraceElement[i].getMethodName());
            }
        }
    
        /**
         * 借助Exception
         */
        public void testThree() {
            StackTraceElement[] stackTraceElement=new Exception().getStackTrace();
            for (int i = 0; i < stackTraceElement.length; i++) {
                System.out.println(Thread.currentThread().getName() + "::::::" + stackTraceElement[i].getClassName() + "."+ stackTraceElement[i].getMethodName());
            }
        }
    
    }

    输出结果:

    main::::::java.lang.Thread.dumpThreads
    main::::::java.lang.Thread.getAllStackTraces
    main::::::com.jhy.getStackTraceDemo.DemoTest.testOne
    main::::::com.jhy.getStackTraceDemo.DemoTest.main
    ++++++++++++++++++++++++++++++++
    main::::::java.lang.Thread.getStackTrace
    main::::::com.jhy.getStackTraceDemo.DemoTest.testTwo
    main::::::com.jhy.getStackTraceDemo.DemoTest.main
    ++++++++++++++++++++++++++++++++
    main::::::com.jhy.getStackTraceDemo.DemoTest.testThree
    main::::::com.jhy.getStackTraceDemo.DemoTest.main


  • 相关阅读:
    Java并发之CAS与AQS简介
    关系型数据库三范式
    分库分表使用场景及设计方式
    项目部署到tomcat出错(tomcat运行时的JDK版本)
    手写一个简化版Tomcat
    java并发之并发工具
    java并发之停止线程
    class中static总结-静态成员函数和静态成员变量
    45 孩子们的游戏(圆圈中最后剩下的数) + list操作总结+ for_each多记忆容易忘记
    C++ split分割字符串函数
  • 原文地址:https://www.cnblogs.com/kitor/p/10610085.html
Copyright © 2011-2022 走看看