This method, available only in the Oracle/Sun/OpenJDK implementations of the Java Virtual Machine, is a much more
efficient mechanism for determining the Class of the caller of a particular method. When it is not available,
a SecurityManager is the second-best option. When this is also not possible, the StackTraceElement[]
returned by Throwable#getStackTrace() must be used, and its String class name converted to a
Class using the slow Class#forName (which can add an extra microsecond or more for each invocation
depending on the runtime ClassLoader hierarchy).
During Java 8 development, the sun.reflect.Reflection.getCallerClass(int) was removed from OpenJDK, and this
change was back-ported to Java 7 in version 1.7.0_25 which changed the behavior of the call and caused it to be off
by one stack frame. This turned out to be beneficial for the survival of this API as the change broke hundreds of
libraries and frameworks relying on the API which brought much more attention to the intended API removal.
After much community backlash, the JDK team agreed to restore getCallerClass(int) and keep its existing
behavior for the rest of Java 7. However, the method is deprecated in Java 8, and current Java 9 development has not
addressed this API. Therefore, the functionality of this class cannot be relied upon for all future versions of Java.
It does, however, work just fine in Sun JDK 1.6, OpenJDK 1.6, Oracle/OpenJDK 1.7, and Oracle/OpenJDK 1.8. Other Java
environments may fall back to using Throwable#getStackTrace() which is significantly slower due to
examination of every virtual frame of execution.
| Modifier and Type | Field and Description |
|---|---|
| private static final Class | DEFAULT_CALLER_CLASS
Todo Use Object.class. |
| private static final Method | |
| private static final StackLocator | |
| pack-priv static final int | JDK_7U25_OFFSET
TODO Consider removing now that we require Java 8. |
| Access | Constructor and Description |
|---|---|
| private |
| Modifier and Type | Method and Description |
|---|---|
| public StackTraceElement | |
| public Class | |
| public Class | Returns: A class or null.The stack frame count to walk. depth)Gets the Class of the method that called this method at the location up the call stack by the given stack frame depth. |
| public Class | |
| public Class | |
| public Deque | |
| public static StackLocator | |
| public StackTraceElement | |
| private boolean |
| DEFAULT_CALLER_CLASS | back to summary |
|---|---|
| private static final Class<?> DEFAULT_CALLER_CLASS Todo Use Object.class. | |
| GET_CALLER_CLASS_METHOD | back to summary |
|---|---|
| private static final Method GET_CALLER_CLASS_METHOD | |
| INSTANCE | back to summary |
|---|---|
| private static final StackLocator INSTANCE | |
| JDK_7U25_OFFSET | back to summary |
|---|---|
| pack-priv static final int JDK_7U25_OFFSET TODO Consider removing now that we require Java 8. | |
| StackLocator | back to summary |
|---|---|
| private StackLocator() | |
| calcLocation | back to summary |
|---|---|
| public StackTraceElement calcLocation(final String fqcnOfLogger) | |
| getCallerClass | back to summary |
|---|---|
public Class
| |
| getCallerClass | back to summary |
|---|---|
| public Class Gets the Class of the method that called this method at the location up the call stack by the given stack frame depth.
This method returns
| |
| getCallerClass | back to summary |
|---|---|
public Class
| |
| getCallerClass | back to summary |
|---|---|
public Class
| |
| getCurrentStackTrace | back to summary |
|---|---|
public Deque
| |
| getInstance | back to summary |
|---|---|
| public static StackLocator getInstance() Gets the singleton instance.
| |
| getStackTraceElement | back to summary |
|---|---|
| public StackTraceElement getStackTraceElement(final int depth) | |
| isValid | back to summary |
|---|---|
| private boolean isValid(final StackTraceElement element) | |