Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

Java 9에서 StackFrame의 특정 클래스를 건너뛰는 방법은 무엇입니까?


StackWalker API 자바 9에 도입되었습니다. , 주어진 시점에서 현재 스레드의 스택 추적에 대한 스냅샷을 제공하고 이를 통해 이동할 수 있는 메서드가 있습니다. StackWalker 사용의 이점 Thread::getStackTrace()를 통한 클래스는 필터링하는 것입니다. 또는 건너뛰기 특정 클래스를 만들고 클래스 자체를 선언하는 인스턴스를 가져오고 전체 스택 추적 자체를 가져오는 대신 짧은 스택 추적 또는 전체 스택 추적을 가져옵니다.

아래 예에서는 java.util.stream.Stream.skip()를 사용할 수 있습니다. 스택 프레임을 건너뛰는 방법입니다.

예시

import java.lang.StackWalker.*;
import java.util.Optional;
import java.util.List;
import java.util.stream.Collectors;
import java.lang.StackWalker.StackFrame;

public class StackWalkerSkipTest {
   public static void main(String args[]) {
      new StackWalkerSkipTest().stackWalk();
   }
   private class StackWalker4 {
      public void stackWalk4() {
      List<StackFrame> framesAfterSkip = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).walk((s) ->
s.skip(2).collect(Collectors.toList()));
      System.out.println("Frames after skip : \n" + framesAfterSkip.toString());
   }
}
   public void stackWalk() {
      new StackWalker1().stackWalk1();
   }
   private class StackWalker1 {
      public void stackWalk1() {
         new StackWalker2().stackWalk2();
      }
   }
   private class StackWalker2 {
      public void stackWalk2() {
         new StackWalker3().stackWalk3();
      }
   }
   private class StackWalker3 {
      public void stackWalk3() {
         new StackWalker4().stackWalk4();
      }
   }
}

출력

Frames after skip :
[StackWalkerSkipTest$StackWalker2.stackWalk2(StackWalkerSkipTest.java:29),
StackWalkerSkipTest$StackWalker1.stackWalk1(StackWalkerSkipTest.java:24),
StackWalkerSkipTest.stackWalk(StackWalkerSkipTest.java:19),
StackWalkerSkipTest.main(StackWalkerSkipTest.java:9)]