java 获取当前方法的被调用信息(被那个方法那个类那一行调用)

java 获取当前方法的被调用信息(被那个方法那个类那一行调用)

我本意是为Android的log写一个动态生成的tag,之前一直用固定的tag,但是在日志输出多了以后发现生成的日志太多其实分析起来也挺麻烦的,所以想写一个自动生成的tag,这样就不用每个类都自己写一个tag字段也能分辨出来日志是在哪个类中输出的。 主要是利用了查询当前线程堆栈中的信息辨别该代码的调用顺序,当然这种方式是没有过多放入考虑其他的问题;

代码部分

main 方法 一个简单例子

public class Test {

    public static void main(String[] args) {
        LogUtils.v();
    }
}

查询代码的被调用信息 主要内容在 defaultTag()中

public class LogUtils {

    public static void v() {
        d();
    }

    public static void d() {
        i();
    }

    public static void i() {
        w();
    }

    public static void w() {
        e();
    }

    public static void e() {
        defaultTag();
    }

    private static String defaultTag() {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        for (StackTraceElement e : stackTrace) {
            System.out.println(e.getClassName() + "\t"
                    + e.getMethodName() + "\t" + e.getLineNumber());
        }
        StackTraceElement log = stackTrace[1];
        String tag = null;
        for (int i = 1; i < stackTrace.length; i++) {
            StackTraceElement e = stackTrace[i];
            if (!e.getClassName().equals(log.getClassName())) {
                tag = e.getClassName() + "." + e.getMethodName();
                break;
            }
        }
        if (tag == null) {
            tag = log.getClassName() + "." + log.getMethodName();

        }
        System.out.println(tag);
        return tag;
    }
}

输出日志

java.lang.Thread    getStackTrace   1556
com.caesar.db.utils.LogUtils    defaultTag  32
com.caesar.db.utils.LogUtils    e   28
com.caesar.db.utils.LogUtils    w   24
com.caesar.db.utils.LogUtils    i   20
com.caesar.db.utils.LogUtils    d   16
com.caesar.db.utils.LogUtils    v   12
com.caesar.db.utils.Test    main    11
sun.reflect.NativeMethodAccessorImpl    invoke0 -2
sun.reflect.NativeMethodAccessorImpl    invoke  62
sun.reflect.DelegatingMethodAccessorImpl    invoke  43
java.lang.reflect.Method    invoke  498
com.intellij.rt.execution.application.AppMain   main    147
com.caesar.db.utils.Test.main

代码比较简单,主要用到 Thread.currentThread().getStackTrace() 这个方法 查询线程堆栈中的信息,然后检出LogUtils 的上一级调用类,也就是调用LogUtils 的类和方法 作为当前日志输出的tag。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值