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

  

本文研究的主要是StackTraceElement获取方法调用栈信息的相关内容,具体介绍和实例如下。

  

一、什么是加

  

加(堆栈轨迹)存放的就是方法调用栈的信息,异常处理中常用的printStackTrace()实质就是打印异常调用的堆栈信息。

  

二,StackTraceElement介绍

  

StackTraceElement表示异常堆栈(堆栈轨迹)中的一个方法对象,属性包括方法的类名,方法名,文件名以及调用的行数。

        公众最终java类StackTraceElement实现。可序列化的{//正常初始化的VM(公共构造函数中添加1.5)   私人字符串declaringClass;   私人字符串methodName;   私人字符串文件名;   私人int lineNumber;   }      

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

  

获取StackTraceElement的方法有两种,均返回StackTraceElement数组,也就是这个栈的信息。

  

<强> 1,Thread.currentThread () .getStackTrace()

  

<强> 2,()新Throwable .getStackTrace()

  

StackTraceElement数组包含了加(堆栈轨迹)的内容,通过遍历它可以得到方法间的调用过程,即可以得到当前方法以及其调用者的方法名,调用行数等信息

        公开课TestClass {   公共静态void main (String [] args)   {   新的TestClass () .methodA ();   }   私人空间methodA () {   System.out.println(“- - - - - -进入methodA - - - - - - - - - - -”);   methodB ();   }   私人空间methodB () {   System.out.println(“- - - - - -进入methodB - - - - - - - - - - -”);   .getStackTrace StackTraceElement元素[]=Thread.currentThread () ();   for (int i=0;我& lt;elements.length;我+ +){   StackTraceElement StackTraceElement=[我]元素;   字符串className=stackTraceElement.getClassName ();   字符串methodName=stackTraceElement.getMethodName ();   字符串文件名=stackTraceElement.getFileName ();   int lineNumber=stackTraceElement.getLineNumber ();   system . out。println (“StackTraceElement数组下标我=" +我+”,文件名="   +文件名+”,className=" +名称+”,methodName=" + methodName +”, lineNumber=" + lineNumber);   }   }   }      

三,用途

  

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

        公共静态孔隙d(字符串标签,字符串味精、对象…params) {   StackTraceElement targetStackTraceElement=getTargetStackTraceElement ();   日志。d(标签”(“+ targetStackTraceElement.getFileName () +”:“   + targetStackTraceElement.getLineNumber () + ") ");   日志。d(标签,字符串。格式(味精、params));   }      

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

  

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

        公开课PVSdk {   公共静态孔隙onResume () {   异常堆栈StackTraceElement []=Thread.currentThread () .getStackTrace ();   布尔结果=false;   (StackTraceElement StackTraceElement:加亮){   字符串methodName=stackTraceElement.getMethodName ();   字符串className=stackTraceElement.getClassName ();   尝试{   布尔assignableFromClass=forname(名称).isAssignableFrom (Activity.class);   如果(assignableFromClass,,“onResume .equals (methodName)) {   结果=true;   打破;   }   }   抓住(ClassNotFoundException e) {   }   }   如果结果(!)   把新RuntimeException (“PVSdk。onResume必须在Activity.onResume”);   }   }      

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

  

<>强总结

  

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

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