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。