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

您所在的位置:网站首页 溺水的一般表现为 java 获取当前方法的被调用信息(被那个方法那个类那一行调用)

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

2023-11-13 13:31| 来源: 网络整理| 查看: 265

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。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3