1.先康康JDK源码的注释

Thread.currentThread().getStackTrace()

Thread.currentThread().getStackTrace()[?]_数组


返回表示此线程的堆栈转储的堆栈跟踪元素数组。 如果此线程尚未启动,已启动但尚未安排由系统运行或已终止,则此方法将返回零长度数组。 如果返回的数组长度为非零,则数组的第一个元素表示堆栈的顶部,这是序列中最近的方法调用。 数组的最后一个元素表示堆栈的底部,这是序列中最近的方法调用。

如果有一个安全管理器,并且该线程不是当前线程,则调用安全管理器的checkPermission方法,并获得RuntimePermission(“getStackTrace”)权限,以查看是否可以获得堆栈跟踪。

在某些情况下,某些虚拟机可能会从堆栈跟踪中省略一个或多个堆栈帧。 在极端情况下,允许没有关于此线程的堆栈跟踪信息的虚拟机从此方法返回零长度数组。

说白了也就是方法调用时,进入堆栈的顺序罢了!
2.做个简单测试

public class Test {

public static void out(){
String classNameFull0 = Thread.currentThread().getStackTrace()[0].getClassName();
System.out.println(classNameFull0);
String classNameFull1 = Thread.currentThread().getStackTrace()[1].getClassName();
System.out.println(classNameFull1);
String classNameFull2 = Thread.currentThread().getStackTrace()[2].getClassName();
System.out.println(classNameFull2);
}

}

创建启动类

public static void main(String[] args) {
Test.out();
}

输出结果!

Thread.currentThread().getStackTrace()[?]_数组_02


这里数组中的长度和方法调用层数有关,也就是入栈的次数,如果栈帧中就只有两个方法,你的数组下标还写了3那么就会报越界错误!