StackTraceElement获取方法调用栈信息实例详解
本文研究的主要是StackTraceElement获取方法调用栈信息的相关内容,具体介绍和实例如下。
一、什么是StackTrace
StackTrace(堆栈轨迹)存放的就是方法调用栈的信息,异常处理中常用的printStackTrace()实质就是打印异常调用的堆栈信息。
二、StackTraceElement介绍
StackTraceElement表示StackTrace(堆栈轨迹)中的一个方法对象,属性包括方法的类名、方法名、文件名以及调用的行数。
publicfinalclassStackTraceElementimplementsjava.io.Serializable{ //NormallyinitializedbyVM(publicconstructoraddedin1.5) privateStringdeclaringClass; privateStringmethodName; privateStringfileName; privateintlineNumber; }
StackTraceElement被定义为final,可见其作为一个java的基础类不允许被继承。
获取StackTraceElement的方法有两种,均返回StackTraceElement数组,也就是这个栈的信息。
1、Thread.currentThread().getStackTrace()
2、newThrowable().getStackTrace()
StackTraceElement数组包含了StackTrace(堆栈轨迹)的内容,通过遍历它可以得到方法间的调用过程,即可以得到当前方法以及其调用者的方法名、调用行数等信息
publicclassTestClass{ publicstaticvoidmain(String[]args) { newTestClass().methodA(); } privatevoidmethodA(){ System.out.println("------进入methodA----------"); methodB(); } privatevoidmethodB(){ System.out.println("------进入methodB----------"); StackTraceElementelements[]=Thread.currentThread().getStackTrace(); for(inti=0;i三、用途
1、我们可以封装一个日志库,在打印目标日志的时候,也可以通过这个调用栈打印出这个日志所在的行数,这样就可以迅速的定位到日志输出行,再也不要全局搜索去查找了。
publicstaticvoidd(Stringtag,Stringmsg,Object...params){ StackTraceElementtargetStackTraceElement=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方法中调用的。
publicclassPVSdk{ publicstaticvoidonResume(){ StackTraceElement[]stackTrace=Thread.currentThread().getStackTrace(); Booleanresult=false; for(StackTraceElementstackTraceElement:stackTrace){ StringmethodName=stackTraceElement.getMethodName(); StringclassName=stackTraceElement.getClassName(); try{ BooleanassignableFromClass=Class.forName(className).isAssignableFrom(Activity.class); if(assignableFromClass&&"onResume".equals(methodName)){ result=true; break; } } catch(ClassNotFoundExceptione){ } } if(!result) thrownewRuntimeException("PVSdk.onResumemustinActivity.onResume"); } }3、我们在进行源码分析的时候,如果想分析整个代码的执行流程,我们可以进行通过打印栈的信息来获取,这个在源码分析的时候还是挺有用的。
总结
以上就是本文关于StackTraceElement获取方法调用栈信息实例详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!