Maison> Java> javaDidacticiel> le corps du texte

Comment imprimer différents cadres de pile à l'aide de l'API StackWalker en Java ?

王林
Libérer: 2023-09-06 20:17:02
avant
835 Les gens l'ont consulté

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

Java 9 définit unStackWalkerAPIqui fournit la paresse et le filtrage des images. L'objetStackWalkernous permet de parcourir et d'accéder à la pile et contient une méthode utile :walk(). Cette méthode ouvre unStackFramestreampour le fil de discussion actuel, puis applique la fonction à ceStackFramestream. Nous devons obtenir l'objetStackWalker, puis utiliser la méthodeStackWalker.getInstance().

Dans l'exemple ci-dessous, nous pouvons imprimer différents cadres de pile de contenu :tous lescadres de pile,ignorercertains cadres de pile etlimiter lescadres de pile à l'aide de l'APIStackWalker. p>

Exemple

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 = StackWalker.getInstance(Set.of(StackWalker.Option.RETAIN_CLASS_REFERENCE, StackWalker.Option.SHOW_HIDDEN_FRAMES), 16); Stream stackStream = StackWalker.getInstance().walk(f -> f); System.out.println("--- Walk all StackFrames ---"); List stacks = walkAllStackframes(); System.out.println(stacks); System.out.println("--- Skip some StackFrames ---"); List stacksAfterSkip = walkSomeStackframes(3); System.out.println(stacksAfterSkip); System.out.println("--- Limit StackFrames ---"); List stacksByLimit = walkLimitStackframes(3); System.out.println(stacksByLimit); } private List walkAllStackframes() { return StackWalker.getInstance().walk(s -> s.map(frame -> "\n" + frame.getClassName() + "/" + frame.getMethodName()).collect(Collectors.toList())); } private List walkSomeStackframes(int numberOfFrames) { return StackWalker.getInstance().walk(s -> s.map(frame -> "\n" + frame.getClassName() + "/" + frame.getMethodName()).skip(numberOfFrames).collect(Collectors.toList())); } private List walkLimitStackframes(int numberOfFrames) { return StackWalker.getInstance().walk(s -> s.map(frame -> "\n" + frame.getClassName() + "/" + frame.getMethodName()).limit(numberOfFrames).collect(Collectors.toList())); } } }
Copier après la connexion

Sortie

--- Walk all StackFrames --- [ StackWalkerTest$Walker2/walkAllStackframes, StackWalkerTest$Walker2/Method2, StackWalkerTest$Walker2/Method1, StackWalkerTest$Walker2/walk, StackWalkerTest$Walker1/walk, StackWalkerTest/walk, StackWalkerTest/main ] --- Skip some StackFrames --- [ StackWalkerTest$Walker2/walk, StackWalkerTest$Walker1/walk, StackWalkerTest/walk, StackWalkerTest/main ] --- Limit StackFrames --- [ StackWalkerTest$Walker2/walkLimitStackframes, StackWalkerTest$Walker2/Method2, StackWalkerTest$Walker2/Method1 ]
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:tutorialspoint.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!