StackTraceElement获取方法调用栈信息实例详解

网友投稿 342 2023-02-20


StackTraceElement获取方法调用栈信息实例详解

本文研究的主要是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);

}

}

}

三、用途

1、我们可以封装一个日志库,在打印目标日志的时候,也可以通过这个调用栈打印出这个日志所在的行数,这样就可以迅速的定位到日志输出行,再也不要全局搜索去查找了。

public static void d(String tag, String msg, Object... params) {

StackTraceElement targetStackTraceElement = getTargetStackTraceElement();

Log.d(tag, "(" + targetStackTraceElement.getFileName() + ":"

+ targetStackTraceElement.getLineNumber() + ")");

Log.d(tag, String.format(msg, params));

}

2、如果我们写了一个SDK,希望某个方法在固定的位置被调用,我们也可以在这个方法被调用的时候,进行检查,看这个方法的调用位置是否正确。

例如,必须在Activity.onResume中执行,PVSdk.onResume,所以我们在调用PVSdk.onResume方法的时候,在PVSdk.onResume方法里面来通过获取调用栈的信息检测这个方法是否在Activity的onResume方法中调用的。

public class PVSdk {

public static void onResume() {

StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();

Boolean result = false;

for (StackTraceElement stackTraceElement : stackTrace) {

String methodName = stackTraceElement.getMethodName();

String className = stackTraceElement.getClassName();

try {

Boolean assignableFromClass = Class.forName(className).isAssignableFrom(Activity.class);

if (assignableFromClass && "onResume".equals(methodNameiNbpAgtkc)) {

result = true;

break;

}

}

catch (ClassNotFoundException e) {

}

}

if (!result)

throw new RuntimeException("PVSdk.onResume must in AciNbpAgtkctivity.onResume");

}

}

3、我们在进行源码分析的时候,如果想分析整个代码的执行流程,我们可以进行通过打印栈的信息来获取,这个在源码分析的时候还是挺有用的。

总结

以上就是本文关于StackTraceElement获取方法调用栈信息实例详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专http://题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信小程序数字滚动插件使用详解
下一篇:Java实现的模糊匹配某文件夹下的文件并删除功能示例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~