Rumah > Java > javaTutorial > Bagaimana untuk mencetak bingkai tindanan yang berbeza menggunakan API StackWalker dalam Java?

Bagaimana untuk mencetak bingkai tindanan yang berbeza menggunakan API StackWalker dalam Java?

王林
Lepaskan: 2023-09-06 20:17:02
ke hadapan
1053 orang telah melayarinya

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

Java 9 mentakrifkan StackWalkerAPI yang menyediakan kemalasan dan penapisan bingkai. Objek StackWalker membolehkan kita berjalan dan mengakses timbunan dan mengandungi kaedah yang berguna: walk(). Kaedah ini membuka strim StackFrame untuk utas semasa dan kemudian menggunakan fungsi itu pada strim StackFrame itu. Kita perlu mendapatkan objek StackWalker dan kemudian gunakan kaedah StackWalker.getInstance().

Dalam contoh di bawah, kita boleh mencetak bingkai tindanan kandungan yang berbeza: semua bingkai tindanan, langkau bingkai tindanan tertentu dan hadkan bingkai tindanan menggunakan StackWalkerAPI. p>

Contoh

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())); 
      }
   }
}
Salin selepas log masuk

Output

<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>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk mencetak bingkai tindanan yang berbeza menggunakan API StackWalker dalam Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan