假设你想在你的Android自己主动打印程序MainActivity.onCreate(line:37)这样的类名.方法名称(行)登录如何实现?

1.介绍Java线程执行堆栈

Java.lang包中提供了StackTraceElement,能够用来获取方法的调用栈信息。

通过调用线程函数Thread.currentThread().getStackTrace()能够获得StackTraceElement[]的堆栈数组。数组中保存了线程中的运行调用的方法。观察以下的代码:

  @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace();System.out.println("call oncreate method");System.out.println("stacktrace len:" + stacktrace.length);for (int i = 0; i < stacktrace.length; i++) {System.out.println("----  the " + i + " element  ----");System.out.println("toString: " + stacktrace[i].toString());System.out.println("ClassName: " + stacktrace[i].getClassName());System.out.println("FileName: " + stacktrace[i].getFileName());System.out.println("LineNumber: " + stacktrace[i].getLineNumber());System.out.println("MethodName: " + stacktrace[i].getMethodName());}}
在onCreate方法中调用getStackTrace方法获取调用栈的信息。打印的结果例如以下:
观察输出结果能够看出栈中先运行的方法是VM和Thread中的方法。第3条才是你调用所在的方法(调用getStackTrack的方法)。

2.日志模块设计

生成tag:
private static String generateTag(StackTraceElement stack){String tag = "%s.%s(L:%d)";String className = stack.getClassName();className = className.substring(className.lastIndexOf(".")+1);tag = String.format(tag, stack.getClassName(),className,stack.getLineNumber());tag = customTagPrefix==null?

tag:customTagPrefix+":"+tag;return tag;}

CustomTagPrefix是自己定义的前缀。 包装LOG:
public static void d(String content){if (!allowD) {return ;}StackTraceElement caller = Thread.currentThread().getStackTrace()[3];String tag = generateTag(caller);Log.d(tag, content);}public static void d(String content,Throwable thr){if (!allowD) {return;}StackTraceElement caller = Thread.currentThread().getStackTrace()[3];String tag = generateTag(caller);Log.d(tag, content,thr);}
getStackTrace()[3],取第四个的原因是前两个分别为vm和Thread的方法,下标2是当前的d()方法,调用d()的方法的下标为3。


版权声明:本文博客原创文章,博客,未经同意,不得转载。

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. android APP字体大小,不随系统的字体大小变化而变化的方法
  3. Android实现判断手机未接来电及处理方法
  4. android中webview接收favicon总是获取为null解决方案
  5. android IPC通信中的UID和PID识别
  6. Android(安卓)编译时注解 —— 语法详解
  7. flutter中实现仿Android端的onResume和onPause方法
  8. Android(安卓)Native性能测试方法
  9. AsyncTask不同版本线程池的区别

随机推荐

  1. Android手机操作系统中的常用术语
  2. Android 核心分析(13) -----Android GWES
  3. 对 android apk 进行重新签名操作
  4. 理解Android Binder机制(3/3):Java层
  5. android MK文件简介
  6. android:layout_gravity和android:gravit
  7. [Android] 基于 Linux 命令行构建 Androi
  8. Android 4层框架
  9. Android(安卓)打造RxBus2.x的全面详解
  10. 【Monkey】Android(安卓)Monkey autotest