Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

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


스택워커 API는 프로그램 실행 중에 스택 추적에 정보 스트림을 제공합니다. 이 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 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)]