Computer >> Máy Tính >  >> Lập trình >> Java

Làm cách nào để bỏ qua một số lớp nhất định trong StackFrame trong Java 9?


API StackWalker đã được giới thiệu trong Java 9 , và nó cung cấp một ảnh chụp nhanh về dấu vết ngăn xếp của luồng hiện tại tại bất kỳ thời điểm nhất định nào và có các phương pháp để xem qua nó. Lợi thế của việc sử dụng StackWalker class over Thread ::getStackTrace () là bộ lọc hoặc bỏ qua một số lớp nhất định và nhận ví dụ khai báo chính lớp đó và nhận dấu vết ngăn xếp ngắn hoặc dấu vết ngăn xếp đầy đủ thay vì tự kéo dấu vết ngăn xếp hoàn chỉnh.

Trong ví dụ dưới đây, chúng ta có thể sử dụng java.util.stream.Stream.skip () phương pháp bỏ qua Khung xếp chồng.

Ví dụ

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();
      }
   }
}

Đầu ra

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)]