java方法执行轨迹跟踪
方法a调用方法b,执行b时,需要知道是谁调用它的,当然在这里就是方法a,但是该如何获取呢?
public class ClassReferrer {
public void aaa() { System.out.println(); System.out.println("执行: " + Thread.currentThread().getStackTrace()[1]); System.out.println("方法: " + Thread.currentThread().getStackTrace()[2] + " 调用了 " + Thread.currentThread().getStackTrace()[1]); bbb(); }
public void bbb() { System.out.println(); System.out.println("执行: " + Thread.currentThread().getStackTrace()[1]); System.out.println("方法: " + Thread.currentThread().getStackTrace()[2] + " 调用了 " + Thread.currentThread().getStackTrace()[1]); ccc(); }
public void ccc() { System.out.println(); System.out.println("执行: " + Thread.currentThread().getStackTrace()[1]); System.out.println("方法: " + Thread.currentThread().getStackTrace()[2] + " 调用了 " + Thread.currentThread().getStackTrace()[1]); System.out.println("方法: " + Thread.currentThread().getStackTrace()[3] + " 调用了 " + Thread.currentThread().getStackTrace()[2]); }
public static void main(String[] args) { ClassReferrer o = new ClassReferrer(); System.out.println("开始"); o.aaa(); System.out.println(); System.out.println("结束"); } }
|
结果
开始
执行: ClassReferrer.aaa(ClassReferrer.java:5) 方法: ClassReferrer.main(ClassReferrer.java:27) 调用了 ClassReferrer.aaa(ClassReferrer.java:6)
执行: ClassReferrer.bbb(ClassReferrer.java:12) 方法: ClassReferrer.aaa(ClassReferrer.java:7) 调用了 ClassReferrer.bbb(ClassReferrer.java:13)
执行: ClassReferrer.ccc(ClassReferrer.java:19) 方法: ClassReferrer.bbb(ClassReferrer.java:14) 调用了 ClassReferrer.ccc(ClassReferrer.java:20) 方法: ClassReferrer.aaa(ClassReferrer.java:7) 调用了 ClassReferrer.bbb(ClassReferrer.java:14)
结束 |
这里贴一个应用
import org.slf4j.Logger;
public class LoggerFactory {
/** * 根据线程自动获取类名称 */ public static Logger getLogger() { StackTraceElement[] el = Thread.currentThread().getStackTrace(); if (el != null && el[2] != null) return org.slf4j.LoggerFactory.getLogger(el[2].getClassName()); return org.slf4j.LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); }
/** * 针对同名类LoggerFactory重写getLogger方法 */ public static Logger getLogger(String name) { return org.slf4j.LoggerFactory.getLogger(name); } } |
调用
import org.slf4j.Logger;
public class HelloWorld { private static Logger slf4jlog = LoggerFactory.getLogger(HelloWorld.class.getName()); public static void main(String[] args) { slf4jlog.debug("原有日志测试"); LoggerFactory.getLogger().debug("改造后日志测试"); } } |
*******站在巨人的肩膀上