자바 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