在学习java日志体系的源码时,看到了一段有趣的代码。
参照java.util.logging.LogRecord 542 private void inferCaller()
编写一个打印方法调用轨迹的工具类(实际工作中使用Debug)
public class StackTraceUtil { /** * 在想要显示调用轨迹的方法中加入StackTraceUtil.showStackTrace(); */ public static void showStackTrace(){ JavaLangAccess access= SharedSecrets.getJavaLangAccess(); Throwable throwable = new Throwable(); int depth=access.getStackTraceDepth(throwable); System.out.println("--------------------showStackTrace:sort[Method][Class][LineNumber]--------------------------"); for (int i=depth-1;i>0;i--){//从1开始不显示当前工具类调用 StackTraceElement ste=access.getStackTraceElement(throwable,i); for(int j=1;j<depth-i;j++){ System.out.print("\t");//缩进 } System.out.println(String.format("%d[%s()][%s][%s]",i,ste.getMethodName(),ste.getClassName(),ste.getLineNumber())); } System.out.println("--------------------showStackTrace:sort[Method][Class][LineNumber]--------------------------"); } }