Heim > Java > javaLernprogramm > Wie drucke ich verschiedene Stapelrahmen mithilfe der StackWalker-API in Java?

Wie drucke ich verschiedene Stapelrahmen mithilfe der StackWalker-API in Java?

王林
Freigeben: 2023-09-06 20:17:02
nach vorne
938 Leute haben es durchsucht

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

Java 9 definiert eine StackWalkerAPI, die Faulheit und Frame-Filterung bietet. Das StackWalker-Objekt ermöglicht uns das Gehen und Zugreifen auf den Stapel und enthält eine nützliche Methode: walk(). Diese Methode öffnet einen StackFrameStream für den aktuellen Thread und wendet dann die Funktion auf diesen StackFrameStream an. Wir müssen das StackWalker-Objekt abrufen und dann die StackWalker.getInstance()-Methode verwenden.

Im folgenden Beispiel können wir verschiedene Inhaltsstapelrahmen drucken: alle Stapelrahmen, bestimmte Stapelrahmen überspringen und Stapelrahmen begrenzen, indem wir die StackWalkerAPI verwenden. Beispiel 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())); 
      }
   }
}
Nach dem Login kopieren

Ausgabe

<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>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie drucke ich verschiedene Stapelrahmen mithilfe der StackWalker-API in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:tutorialspoint.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage