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("改造后日志测试"); 

    } 

 

 

posted @ 2013-07-04 07:11  小方。  阅读(1988)  评论(0编辑  收藏  举报