>Java >java지도 시간 >Java 9에서 StackWalker API를 사용하여 스택 프레임을 필터링하는 방법은 무엇입니까?

Java 9에서 StackWalker API를 사용하여 스택 프레임을 필터링하는 방법은 무엇입니까?

WBOY
WBOY앞으로
2023-09-14 18:25:02797검색

如何在Java 9中使用StackWalker API过滤堆栈帧?

StackWalkerAPI는 프로그램 실행 중에 스택 추적의 정보 흐름을 제공합니다. 이 API에는 전체 스택의 스냅샷을 캡처하고 필터링 목적으로 요소 배열을 반환하기 위한 가상 머신이 필요합니다. 스택 프레임을 건너뛰고 삭제하고 제한하려면 walk() 메서드를 사용해야 합니다. 또한 filter() 메서드를 사용하여 클래스별로 스택 프레임을 필터링하여 일치하는 모든 프레임뿐만 아니라 첫 번째 일치하는 프레임을 얻을 수도 있습니다.

아래 예에서는 StackWalker API를 사용하여 스택 프레임을 필터링할 수 있습니다.

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

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

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

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

출력

<strong>--- 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)]</strong>

위 내용은 Java 9에서 StackWalker API를 사용하여 스택 프레임을 필터링하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 tutorialspoint.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제