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