Thread.currentThread().getStackTrace()方法中使用了new Exception().getStackTrace();
public StackTraceElement[] getStackTrace() {
if (this != Thread.currentThread()) {
// check for getStackTrace permission
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkPermission(
SecurityConstants.GET_STACK_TRACE_PERMISSION);
}
// optimization so we do not call into the vm for threads that
// have not yet started or have terminated
if (!isAlive()) {
return EMPTY_STACK_TRACE;
}
StackTraceElement[][] stackTraceArray = dumpThreads(new Thread[] {this});
StackTraceElement[] stackTrace = stackTraceArray[0];
// a thread that was alive during the previous isAlive call may have
// since terminated, therefore not having a stacktrace.
if (stackTrace == null) {
stackTrace = EMPTY_STACK_TRACE;
}
return stackTrace;
} else {
// Don't need JVM help for current thread
return (new Exception()).getStackTrace();
}
}
public static String getSignedCallHierarchy(Class clz) {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
if (null != stackTrace && stackTrace.length > 0) {
StringBuilder sb = new StringBuilder();
StackTraceElement stackTraceElement;
String fileName;
String className;
String methodName;
int lineNumber;
for (int i = 1; i < stackTrace.length; i++) {
stackTraceElement = stackTrace[i];
className = stackTraceElement.getClassName();
if (!clz.getName().equals(className)) {
continue;
} else {
methodName = stackTraceElement.getMethodName();
fileName = stackTraceElement.getFileName();
lineNumber = stackTraceElement.getLineNumber();
sb.append(className).append(".").append(methodName).append("(").append(fileName).append(":").append(lineNumber).append(")");
break;
}
}
return sb.toString();
}
return "";
}