>  기사  >  Java  >  Java에서 StackWalker API를 사용하여 다양한 스택 프레임을 인쇄하는 방법은 무엇입니까?

Java에서 StackWalker API를 사용하여 다양한 스택 프레임을 인쇄하는 방법은 무엇입니까?

王林
王林앞으로
2023-09-06 20:17:02856검색

如何使用Java中的StackWalker API打印不同的堆栈帧?

Java 9는 게으름과 프레임 필터링을 제공하는 StackWalkerAPI를 정의합니다. StackWalker 개체를 사용하면 스택을 걷고 액세스할 수 있으며 유용한 메서드인 walk()가 포함되어 있습니다. 이 메서드는 현재 스레드에 대한 StackFramestream을 연 다음 해당 StackFrame스트림에 함수를 적용합니다. StackWalker 개체를 가져온 다음 StackWalker.getInstance() 메서드를 사용해야 합니다.

아래 예에서는 StackWalkerAPI를 사용하여 모든 스택 프레임, 건너뛰기 특정 스택 프레임 및 제한 스택 프레임 등 다양한 콘텐츠 스택 프레임을 인쇄할 수 있습니다. p>

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 = <strong>StackWalker.getInstance</strong>(Set.of(StackWalker.Option.RETAIN_CLASS_REFERENCE, StackWalker.Option.SHOW_HIDDEN_FRAMES), 16);
         <strong>Stream<StackFrame></strong> stackStream = <strong>StackWalker.getInstance().walk</strong>(f -> f);

         System.out.println("--- Walk all StackFrames ---");
         <strong>List<String></strong> stacks = walkAllStackframes();
         System.out.println(stacks);

         System.out.println("--- Skip some StackFrames ---");
         <strong>List<String></strong> stacksAfterSkip = walkSomeStackframes(3);
         System.out.println(stacksAfterSkip);

         System.out.println("--- Limit StackFrames ---");
         <strong>List<String></strong> stacksByLimit = walkLimitStackframes(3);
         System.out.println(stacksByLimit);
      }
      private List<String> walkAllStackframes() {
         return <strong>StackWalker.getInstance().walk</strong>(s -> s.map(frame -> "\n" + frame.getClassName() + "/" + frame.getMethodName()).<strong>collect</strong>(Collectors.toList()));
      }
      private List<String> walkSomeStackframes(int numberOfFrames) {
         return <strong>StackWalker.getInstance().walk</strong>(s -> s.map(frame -> "\n" + frame.getClassName() + "/" + frame.getMethodName()).<strong>skip</strong>(numberOfFrames).<strong>collect</strong>(Collectors.toList()));
      }
      private List<String> walkLimitStackframes(int numberOfFrames) {
         return <strong>StackWalker.getInstance().walk</strong>(s -> s.map(frame -> "\n" + frame.getClassName() + "/" + frame.getMethodName()).<strong>limit</strong>(numberOfFrames).<strong>collect</strong>(Collectors.toList())); 
      }
   }
}

출력

<strong>--- Walk all StackFrames ---
[
StackWalkerTest$Walker2/walkAllStackframes,
StackWalkerTest$Walker2/Method2,
StackWalkerTest$Walker2/Method1,
StackWalkerTest$Walker2/walk,
StackWalkerTest$Walker1/walk,
StackWalkerTest/walk,
StackWalkerTest/main</strong>
<strong>]
--- Skip some StackFrames ---
[
StackWalkerTest$Walker2/walk,
StackWalkerTest$Walker1/walk,
StackWalkerTest/walk,
StackWalkerTest/main</strong>
<strong>]
--- Limit StackFrames ---
[
StackWalkerTest$Walker2/walkLimitStackframes,
StackWalkerTest$Walker2/Method2,
StackWalkerTest$Walker2/Method1</strong>
<strong>]</strong>

위 내용은 Java에서 StackWalker API를 사용하여 다양한 스택 프레임을 인쇄하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 tutorialspoint.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제