通过StackTraceElement获取方法调用者的具体信息

本文简要介绍了StackTrace(堆栈轨迹)以及StackTraceElement的一些用法

一、什么是StackTrace

StackTrace(堆栈轨迹)可以认为是一系列方法调用过程的集合。

异常处理中常用的printStackTrace()即为打印异常调用的堆栈信息。

二、StackTraceElement介绍

StackTraceElement表示StackTrace(堆栈轨迹)中的一个元素,属性包括方法调用者的类名、方法名、文件名以及调用的行数。

public final class StackTraceElement implements java.io.Serializable {
    // Normally initialized by VM (public constructor added in 1.5)
    private String declaringClass;
    private String methodName;
    private String fileName;
    private int    lineNumber;

StackTraceElement被定义为final,可见其作为一个java的基础类不允许被继承。

获取StackTraceElement的方法有两种,均返回StackTraceElement数组

1、Thread.currentThread().getStackTrace()
2、new Throwable().getStackTrace()

StackTraceElement数组包含了StackTrace(堆栈轨迹)的内容,通过遍历它可以得到方法间的调用过程,

即可以得到当前方法以及其调用者的方法名、调用行数等信息

public class TestClass
{  
    public static void main(String[] args)  
    {
        new TestClass().methodA();
    }
 
    private void methodA(){
        System.out.println("------进入methodA----------");
        methodB();
    }
 
    private void methodB(){
        System.out.println("------进入methodB----------");
        StackTraceElement elements[] = Thread.currentThread().getStackTrace();
        for (int i = 0; i < elements.length; i++) {
            StackTraceElement stackTraceElement=elements[i];
            String className=stackTraceElement.getClassName();
            String methodName=stackTraceElement.getMethodName();
            String fileName=stackTraceElement.getFileName();
            int lineNumber=stackTraceElement.getLineNumber();
            System.out.println("StackTraceElement数组下标 i="+i+",fileName="
                    +fileName+",className="+className+",methodName="+methodName+",lineNumber="+lineNumber);
        }
    }
}

执行main方法,输出信息如下

在这里插入图片描述

可以看到在方法B中使用getStackTrace,

得到StackTraceElement数组中下标为2的element表示方法B的调用者方法A的详细信息


原文:https://blog.csdn.net/argel_lj/article/details/49925657

在Java中,可以使用StackTraceElement类来获取当前方法的行号、方法名、类名和文件名,以及调用方法方法信息。下面是示例代码: ``` StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); if (stackTraceElements.length >= 2) { // 获取当前方法信息 StackTraceElement currentMethod = stackTraceElements[1]; String className = currentMethod.getClassName(); String methodName = currentMethod.getMethodName(); String fileName = currentMethod.getFileName(); int lineNumber = currentMethod.getLineNumber(); System.out.println("当前方法信息:"); System.out.println("类名:" + className); System.out.println("方法名:" + methodName); System.out.println("文件名:" + fileName); System.out.println("行号:" + lineNumber); // 获取调用方法方法信息 StackTraceElement callerMethod = stackTraceElements[2]; String callerClassName = callerMethod.getClassName(); String callerMethodName = callerMethod.getMethodName(); String callerFileName = callerMethod.getFileName(); int callerLineNumber = callerMethod.getLineNumber(); System.out.println("调用方法方法信息:"); System.out.println("类名:" + callerClassName); System.out.println("方法名:" + callerMethodName); System.out.println("文件名:" + callerFileName); System.out.println("行号:" + callerLineNumber); } ``` 需要注意的是,获取方法信息的代码必须位于该方法内部。如果将该代码放在其他方法中,则获取到的信息可能是其他方法信息。另外,由于获取方法信息的代码本身也会被添加到堆栈跟踪中,因此需要使用`stackTraceElements[2]`来获取调用方法方法信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值