不是特别懂,但是会用了,哈哈
先上一张图片
大家可以看到,wwwwwwww()
并没有出现在栈里,因为它已经出栈了
它的流程大概是这样的
进栈
main()
进栈出栈 …() //忽悠很多方法,直接到f()
进栈
f()
进栈
wwwwwww()
出栈 wwwwwww()
进栈
Throwable()
进栈出栈 …() //忽悠很多方法
在这里 栈的顺序就已经确定了
出栈 Throwable()
进栈
getStackTrace()
在内部进行 克隆后返回 StackTraceElement[]
居然是中文!第一次见有中文的文档注释
出栈 getStackTrace()开始打印
出栈 f()出栈 main()
[ 行号,方法名,类名,文件名] 都是表示,在一个 文件的一个类的一个方法的第n行里进入了另一个方法
比如在 f()方法里 进入了ffffffffff()方法,它保存的是 { 行数:8,方法名:f ,类名:Test ,文件名:Test.java },而不是说在 第8行进入了ffffffff()方法, 记录的是 在第8行的f()方法进入了某个方法
编写日志类
可以调整数组(栈)的下标,来决定返回那一个位置
StackTraceElement 的 toString 被重写了,可以直接使用这个方法
还有个方式可以获取 StackTraceElement[ ]
通过Thread.currentThread().getStackTrace()
获取
不过它的栈顶是一个你不需要的数据