StackWalker API Java 9 で導入され、任意の時点での現在のスレッドのスタック トレース スナップショットを提供します。そしてそれを乗り越える方法があります。 Thread::getStackTrace() と比較して StackWalker クラスを使用する利点は、 特定のクラスを フィルタリングするか、 スキップして、クラス自体を宣言するインスタンスを取得し、短いスタックを取得できることです。フル スタック トレース自体を抽出する代わりに、トレースまたはフル スタック トレースを使用します。
次の例では、 java.util.stream.Stream.skip()
strong> メソッドを使用してスタック フレームをスキップできます。
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() { <strong>List<StackFrame></strong> framesAfterSkip = StackWalker.getInstance(<strong>StackWalker.Option.RETAIN_CLASS_REFERENCE</strong>).walk((s) -> s.<strong>skip</strong>(2).collect(<strong>Collectors.toList()</strong>)); 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(); } } }
<strong>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)]</strong>
以上がJava 9 の StackFrame で特定のクラスをスキップするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。