JavaでStackWalkerAPIを使用してさまざまなスタックフレームを印刷するにはどうすればよいですか?
Java9はStackWalkerを定義します API 怠惰とフレームフィルタリングを提供します。 StackWalkerのオブジェクト スタックをトラバースしてアクセスできるようにし、1つの便利なメソッドが含まれています: walk() 。このメソッドは、 StackFrameを開きます ストリーム 現在のスレッドに対して、その StackFrameで関数を適用します ストリーム。 StackWalkerを入手する必要があります オブジェクトを作成し、 StackWalker.getInstance()を使用します メソッド。
次の例では、さまざまなスタックフレームを印刷できます:すべて スタックフレーム、スキップ いくつかのスタックフレームと制限 StackWalkerを使用してフレームをスタックします API。
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<StackFrame> stackStream = StackWalker.getInstance().walk(f -> f); System.out.println("--- Walk all StackFrames ---"); List<String> stacks = walkAllStackframes(); System.out.println(stacks); System.out.println("--- Skip some StackFrames ---"); List<String> stacksAfterSkip = walkSomeStackframes(3); System.out.println(stacksAfterSkip); System.out.println("--- Limit StackFrames ---"); List<String> stacksByLimit = walkLimitStackframes(3); System.out.println(stacksByLimit); } private List<String> walkAllStackframes() { return StackWalker.getInstance().walk(s -> s.map(frame -> "\n" + frame.getClassName() + "/" + frame.getMethodName()).collect(Collectors.toList())); } private List<String> walkSomeStackframes(int numberOfFrames) { return StackWalker.getInstance().walk(s -> s.map(frame -> "\n" + frame.getClassName() + "/" + frame.getMethodName()).skip(numberOfFrames).collect(Collectors.toList())); } private List<String> walkLimitStackframes(int numberOfFrames) { return StackWalker.getInstance().walk(s -> s.map(frame -> "\n" + frame.getClassName() + "/" + frame.getMethodName()).limit(numberOfFrames).collect(Collectors.toList())); } } }
出力
--- 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 ]
-
Javaでスタックを使用してキューを実装するにはどうすればよいですか?
キュー クラスはコレクションを拡張します インターフェイスであり、先入れ先出し(FIFO)を使用した挿入および削除操作をサポートします 。 スタック Vectorのサブクラスです クラスであり、後入先出(LIFO)を表します オブジェクトのスタック。スタックの一番上に追加された最後の要素(In)は、スタックから削除される最初の要素(Out)にすることができます。以下のプログラムでは、スタックを使用してキューを実装することもできます。 例 import java.util.*; public class QueueUsingStackTest { private St
-
Javaでキューを使用してスタックを実装するにはどうすればよいですか?
スタック Vectorのサブクラスです クラスであり、l ast-in-first-out(LIFO)を表します オブジェクトのスタック。スタックの一番上に追加された最後の要素(In)は、スタックから削除される最初の要素(Out)にすることができます。 キュー クラスはコレクションを拡張します インターフェースとそれは挿入をサポートします および削除 先入れ先出し(FIFO)を使用した操作 。以下のプログラムでは、キューを使用してスタックを実装することもできます。 例 import java.util.*; public class StackFromQueueTest {