Java 9는 StackWalker 를 정의합니다. API 게으름과 프레임 필터링을 제공합니다. StackWalker 의 개체 스택을 탐색하고 액세스할 수 있으며 하나의 유용한 메서드인 walk()가 포함되어 있습니다. . 이 방법은 StackFrame 을 엽니다. 스트림 현재 스레드에 대해 해당 StackFrame 이 있는 함수를 적용합니다. 개울. StackWalker 를 가져와야 합니다. 개체를 선택한 다음 StackWalker.getInstance() 를 사용합니다. 방법.
아래 예에서는 다른 스택 프레임을 인쇄할 수 있습니다. 모두 스택 프레임, 건너뛰기 일부 스택 프레임 및 제한 StackWalker 를 사용하여 프레임 스택 API.
예시
import java.lang.StackWalker.StackFrame; import java.util.*; import java.util.stream.*; public class StackWalkerTest { public static void main(String args[]) { new StackWalkerTest().walk(); } private void walk() { new Walker1().walk(); } private class Walker1 { public void walk() { new Walker2().walk(); } } private class Walker2 { public void walk() { Method1(); } void Method1() { Method2(); } void Method2() { StackWalker stackWalker = StackWalker.getInstance(Set.of(StackWalker.Option.RETAIN_CLASS_REFERENCE, StackWalker.Option.SHOW_HIDDEN_FRAMES), 16); Stream<StackFrame> stackStream = StackWalker.getInstance().walk(f -> f); System.out.println("--- Walk all StackFrames ---"); List<String> stacks = walkAllStackframes(); System.out.println(stacks); System.out.println("--- Skip some StackFrames ---"); List<String> stacksAfterSkip = walkSomeStackframes(3); System.out.println(stacksAfterSkip); System.out.println("--- Limit StackFrames ---"); List<String> stacksByLimit = walkLimitStackframes(3); System.out.println(stacksByLimit); } private List<String> walkAllStackframes() { return StackWalker.getInstance().walk(s -> s.map(frame -> "\n" + frame.getClassName() + "/" + frame.getMethodName()).collect(Collectors.toList())); } private List<String> walkSomeStackframes(int numberOfFrames) { return StackWalker.getInstance().walk(s -> s.map(frame -> "\n" + frame.getClassName() + "/" + frame.getMethodName()).skip(numberOfFrames).collect(Collectors.toList())); } private List<String> walkLimitStackframes(int numberOfFrames) { return StackWalker.getInstance().walk(s -> s.map(frame -> "\n" + frame.getClassName() + "/" + frame.getMethodName()).limit(numberOfFrames).collect(Collectors.toList())); } } }
출력
--- Walk all StackFrames --- [ StackWalkerTest$Walker2/walkAllStackframes, StackWalkerTest$Walker2/Method2, StackWalkerTest$Walker2/Method1, StackWalkerTest$Walker2/walk, StackWalkerTest$Walker1/walk, StackWalkerTest/walk, StackWalkerTest/main ] --- Skip some StackFrames --- [ StackWalkerTest$Walker2/walk, StackWalkerTest$Walker1/walk, StackWalkerTest/walk, StackWalkerTest/main ] --- Limit StackFrames --- [ StackWalkerTest$Walker2/walkLimitStackframes, StackWalkerTest$Walker2/Method2, StackWalkerTest$Walker2/Method1 ]