package com.xiongyingqi.util;
/**
* 堆栈帮助类
*
* @author 瑛琪 <a href="http://xiongyingqi.com">xiongyingqi.com</a>
* @version 2013-8-28 下午3:51:58
*/
public class StackTraceHelper {
/**
* 打印出调用堆栈 <br>
* 2013-8-28 下午3:52:17
*/
public static void printStackTrace() {
Throwable throwable = new Throwable();
StackTraceElement[] stackTraceElements = throwable.getStackTrace();
StackTraceElement[] stackTraceElementsTarget = new StackTraceElement[stackTraceElements.length - 1];
// for (int i = 1, j = 0; i < stackTraceElements.length; i++) {
// StackTraceElement stackTraceElement = stackTraceElements[i];
// System.out.println(stackTraceElement.getClassName());
// System.out.println(stackTraceElement.getFileName());
// System.out.println(stackTraceElement.getMethodName());
// System.out.println(stackTraceElement.getLineNumber());
// System.out.println(" at " + stackTraceElement.getClassName() + "."
// + stackTraceElement.getMethodName() + "(" +
// stackTraceElement.getFileName() + ":" +
// stackTraceElement.getLineNumber() + ")");
// }
System.arraycopy(stackTraceElements, 1, stackTraceElementsTarget, 0,
stackTraceElementsTarget.length);
System.out.println(" ----------------------- StackTrace Info ----------------------- ");
System.out.print(buildStackTrace(stackTraceElementsTarget));
}
/**
* 组织堆栈信息,将堆栈数组拼接成字符串 <br>
* 2013-8-28 下午3:50:50
*
* @param stackTraceElements
* @return String
*/
public static String buildStackTrace(StackTraceElement[] stackTraceElements) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < stackTraceElements.length; i++) {
StackTraceElement stackTraceElement = stackTraceElements[i];
builder.append(" at ");
builder.append(stackTraceElement.getClassName());
builder.append(".");
builder.append(stackTraceElement.getMethodName());
builder.append("(");
builder.append(stackTraceElement.getFileName());
builder.append(":");
builder.append(stackTraceElement.getLineNumber());
builder.append(")");
builder.append(StringHelper.line());
}
return builder.toString();
}
/**
* 返回不包括本类调用堆栈的当前堆栈 <br>
* 2013-7-26 下午6:09:09
*
* @return
*/
public static StackTraceElement[] getStackTrace() {
Throwable throwable = new Throwable();
StackTraceElement[] stackTraceElements = throwable.getStackTrace();
StackTraceElement[] stackTraceElementsTarget = new StackTraceElement[stackTraceElements.length];
System.arraycopy(stackTraceElements, 0, stackTraceElementsTarget, 0,
stackTraceElementsTarget.length);
return stackTraceElementsTarget;
}
/**
* 获取间接调用的类名<p></p>
* 比如A方法调用B方法,B方法再调用whoInvoke()方法,这样B方法内就能返回A方法在那个类下
*
* @return
*/
public static Class whoInvoke() {
Throwable throwable = new Throwable();
StackTraceElement[] stackTraceElements = throwable.getStackTrace();
StackTraceElement stackTraceElement = stackTraceElements[2];
try {
return Class.forName(stackTraceElement.getClassName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
printStackTrace();
StackTraceElement[] stackTraceElements = getStackTrace();
for (int i = 1; i < stackTraceElements.length; i++) {
StackTraceElement stackTraceElement = stackTraceElements[i];
// System.out.println(stackTraceElement.getClassName());
// System.out.println(stackTraceElement.getFileName());
// System.out.println(stackTraceElement.getMethodName());
// System.out.println(stackTraceElement.getLineNumber());
System.out.println(" at " + stackTraceElement.getClassName() + "."
+ stackTraceElement.getMethodName() + "(" + stackTraceElement.getFileName()
+ ":" + stackTraceElement.getLineNumber() + ")");
}
// Long.parseLong("s");
}
}