Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java9でStackWalkerAPIを使用してスタックフレームをフィルタリングするにはどうすればよいですか?


StackWalker APIは、プログラムの実行中にスタックトレースで情報のストリームを提供します。このAPIには仮想マシンが必要です スタック全体のスナップショットをキャプチャし、フィルタリングの目的で要素の配列を返します。 walk()を使用して、スタックフレームをスキップ、ドロップ、および制限する必要があります。 方法。 filter()を使用して、最初に一致するフレームを取得するためにクラスごとにスタックフレームをフィルタリングし、一致するすべてのフレームをフィルタリングすることもできます。 メソッド。

以下の例では、StackWalkerAPIを使用してスタックフレームをフィルタリングできます。

import java.lang.StackWalker.StackFrame;
import java.util.*;
import java.util.stream.*;

public class StackWalkerFilterTest {
   public static void main(String args[]) {
      final List<Class> filterClasses = new ArrayList<>();
      filterClasses.add(StackWalkerFilterTest.class);

      System.out.println("--- filter Frame by Class >> get first matching frame ---");
      Optional<StackFrame> frameByClass = findFrameByClass(filterClasses);
      System.out.println(frameByClass.toString());

      System.out.println("--- filter Frame by Class >> get all matching frames ---");
      List<StackFrame> framesByClass = findAllFramesByClass(filterClasses);
      System.out.println(framesByClass);
   }
   private static Optional<StackFrame> findFrameByClass(List<Class> filterClasses) {
      return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE)
.walk(s -> s.filter(f -> filterClasses.contains(f.getDeclaringClass())).findFirst());
   }
   private static List<StackFrame> findAllFramesByClass(List<Class> filterClasses) {
      return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).walk(
s -> s.filter(f -> filterClasses.contains(f.getDeclaringClass())).collect(Collectors.toList()));
   }
}

出力

--- filter Frame by Class >> get first matching frame ---
Optional[StackWalkerTest.findFrameByClass(StackWalkerTest.java:20)]
--- filter Frame by Class >> get all matching frames ---
[StackWalkerTest.findAllFramesByClass(StackWalkerTest.java:23), StackWalkerTest2.main(StackWalkerTest.java:15)]

  1. Javaスタッククラス

    Javaスタックは、後入れ先出しのデータ構造です。スタックから削除された最初のアイテムは、スタックに最後に追加されたアイテムです。スタックデータ構造は、スタックの最後に新しいアイテムを追加します。 JavaスタックはVectorクラスを拡張します。 プログラミングでは、スタックはデータを格納するために使用される後入れ先出しのデータ構造です。スタックはさまざまな場合に役立ちます。たとえば、リストの対称性をテストしたり、リストの順序を逆にしたりする場合は、スタックを使用できます。 Javaコレクションフレームワークには、 stackというクラスが含まれています。 これは、Javaでスタックを

  2. 年APIクラスを使用してAndroidで年を取得するにはどうすればよいですか?

    この例は、yearAPIクラスを使用してAndroidでyearを取得する方法について示しています。 ステップ1 − Android Studioで新しいプロジェクトを作成し、[ファイル]⇒[新しいプロジェクト]に移動して、新しいプロジェクトを作成するために必要なすべての詳細を入力します。 ステップ2 −次のコードをres / layout/activity_main.xmlに追加します。 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.Const