Gets the Class object of the caller who invoked the method
that invoked getCallerClass.
This method filters reflection, java.lang.invoke.MethodHandle, and
hidden frames regardless of the
SHOW_REFLECT_FRAMES
and SHOW_HIDDEN_FRAMES options
this StackWalker has been configured with.
This method should be called when a caller frame is present. If
it is called from the bottom most frame on the stack,
IllegalCallerException will be thrown.
This method throws UnsupportedOperationException
if this StackWalker is not configured with the
RETAIN_CLASS_REFERENCE option.
Class object of the caller's caller invoking this method.
UnsupportedOperationException | if this StackWalker
is not configured with Option.RETAIN_CLASS_REFERENCE. | |
IllegalCallerException | if there is no caller frame, i.e.
when this getCallerClass method is called from a method
which is the last frame on the stack. |
@apiNote
For example, Util::getResourceBundle loads a resource bundle
on behalf of the caller. It invokes getCallerClass to identify
the class whose method called Util::getResourceBundle.
Then, it obtains the class loader of that class, and uses
the class loader to load the resource bundle. The caller class
in this example is MyTool.
class Util {
private final StackWalker walker = StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE);
public ResourceBundle getResourceBundle(String bundleName) {
Class<?> caller = walker.getCallerClass();
return ResourceBundle.getBundle(bundleName, Locale.getDefault(), caller.getClassLoader());
}
class MyTool {
private final Util util = new Util();
private void init() {
ResourceBundle rb = util.getResourceBundle("mybundle");
}
}
}
An equivalent way to find the caller class using the
walk method is as follows
(filtering the reflection frames, MethodHandle and hidden frames
not shown below):
Optional<Class<?>> caller = walker.walk(s ->
s.map(StackFrame::getDeclaringClass)
.skip(2)
.findFirst());
When the getCallerClass method is called from a method that
is the bottom most frame on the stack,
for example, static public void main method launched by the
java launcher, or a method invoked from a JNI attached thread,
IllegalCallerException is thrown.
Diagram: Exception Support