জাভা ৯-এ java.lang.StackWalker ক্লাস ব্যবহার করে একটি স্ট্যান্ডার্ড API প্রদান করা হয়েছে। এই ক্লাস লেজি এক্সেস অনুমতি দিয়ে স্ট্যাক ফ্রেমের জন্য দক্ষভাবে ডিজাইন করা হয়েছে। কিছু অন্যান্য অপশন স্ট্যাক ট্রেসে আলাদা করে ইমপ্লিমেন্টেশন এবং/অথবা রিফ্লেকশন ফ্রেম অন্তর্ভুক্ত করতে দেয়, যা ডিবাগিং এর জন্য উপকারী হতে পারে। উদাহরণস্বরূপ, StackWalker ইনস্ট্যান্স তৈরি করার সময় SHOW_REFLECT_FRAMES অপশন যোগ করলে, রিফ্লেক্টিভ মেথডের ফ্রেমগুলোও প্রিন্ট হয়।
নিচের উদাহরণে, আমরা StackFrame-এ রিফ্লেকশন ফ্রেম দেখাতে পারি।
উদাহরণ
import java.lang.StackWalker.Option;
import java.lang.StackWalker.StackFrame;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.stream.Collectors;
public class ReflectionFrameTest {
public static void main(String args[]) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Method test1Method = Test1.class.getDeclaredMethod("test1", (Class>[]) null);
test1Method.invoke(null, (Object[]) null);
}
}
class Test1 {
protected static void test1() {
Test2.test2();
}
}
class Test2 {
protected static void test2() {
// show reflection methods
List<StackFrame> stack = StackWalker.getInstance(Option.SHOW_REFLECT_FRAMES).walk((s) -> s.collect(Collectors.toList()));
for(StackFrame frame : stack) {
System.out.println(frame.getClassName() + " " + frame.getLineNumber() + " " + frame.getMethodName());
}
}
}
আউটপুট
Test2 22 test2 Test1 16 test1 jdk.internal.reflect.NativeMethodAccessorImpl -2 invoke0 jdk.internal.reflect.NativeMethodAccessorImpl 62 invoke jdk.internal.reflect.DelegatingMethodAccessorImpl 43 invoke java.lang.reflect.Method 564 invoke ReflectionFrameTest 11 main