자바 9 StackWalker 를 추가했습니다. 현재 스레드 스택에 액세스하기 위한 표준 API를 제공하는 클래스입니다. 이전 자바 버전에서는 Throwable::getStackTrace를 사용할 수 있습니다. , 스레드::getStackTrace 및 SecurityManager::GetClassContext 스레드 스택을 얻는 방법을 제공했습니다.
Thread.getStackTrace() 메소드는 스레드의 스택 덤프를 나타내는 스택 추적 요소의 배열을 반환합니다(StackTraceElement[] ). 배열의 첫 번째 요소는 스택의 맨 위를 나타내며 시퀀스의 마지막 메서드 호출이 될 수 있으며 배열의 마지막 요소는 스택의 맨 아래를 나타내며 시퀀스의 첫 번째 메서드 호출이 될 수 있습니다.
구문
public StackTraceElement[] getStackTrace()
예시
import java.lang.StackWalker.Option;
public class GetStackTraceTest {
public static void main(String args[]) {
GetStackTraceTest.testPrintCurrnentStackTrace();
GetStackTraceTest.testShowReflectFrames();
}
// get StackTrace using Thread
public static void testPrintCurrnentStackTrace() {
StackTraceElement[] stack = Thread.currentThread().getStackTrace();
for(StackTraceElement element : stack) {
System.out.println(element);
}
}
// SHOW_REFLECT_FRAMES
public static void print(StackWalker stackWalker) {
stackWalker.forEach(stackFrame -> System.out.printf("%6d| %s -> %s %n",
stackFrame.getLineNumber(), stackFrame.getClassName(), stackFrame.getMethodName()));
}
public static void testShowReflectFrames() {
final StackWalker stackWalker = StackWalker.getInstance(Option.SHOW_REFLECT_FRAMES);
print(stackWalker);
}
} 출력
java.base/java.lang.Thread.getStackTrace(Thread.java:1654) GetStackTraceTest.testPrintCurrnentStackTrace(GetStackTraceTest.java:10) GetStackTraceTest.main(GetStackTraceTest.java:5) 17| GetStackTraceTest -> print 25| GetStackTraceTest -> testShowReflectFrames 6| GetStackTraceTest -> main