Java 9는 StackWalker API를 통해 지연(lazy) 접근 방식의 효율적인 스택 탐색 기능을 제공하며, 스택 트레이스를 손쉽게 필터링할 수 있습니다. StackWalker 객체를 사용하면 호출 스택을 순회하고 각 스택 프레임에 접근할 수 있습니다. 이 클래스에는 walk(), forEach(), getCallerClass() 등 유용한 메서드들이 포함되어 있습니다.
getCallerClass() 메서드는 현재 실행 중인 메서드를 호출한 클래스, 즉 호출자(caller) 클래스를 반환합니다. 호출자 클래스 정보를 얻으려면 StackWalker 인스턴스를 생성할 때 반드시 RETAIN_CLASS_REFERENCE 옵션을 지정해야 합니다. 이 옵션은 StackWalker가 탐색하는 모든 스택 프레임의 Class 객체 참조를 유지하는 역할을 합니다.
문법
public Class<?> getCallerClass()
예제 코드
import java.lang.StackWalker.Option;
public class StackWalkerTest {
public static void main(String args[]) {
StackWalkerTest1.test1();
}
}
class StackWalkerTest1 {
protected static void test1() {
StackWalkerTest2.test2();
}
}
class StackWalkerTest2 {
protected static void test2() {
System.out.println(StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE).getCallerClass());
}
}
위 예제에서는 main() 메서드가 StackWalkerTest1의 test1()을 호출하고, test1()은 다시 StackWalkerTest2의 test2()를 호출합니다. 따라서 test2() 내부에서 getCallerClass()를 실행하면 자신을 직접 호출한 클래스인 StackWalkerTest1이 반환됩니다.
실행 결과
class StackWalkerTest1