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

1.介绍Java线程执行堆栈

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

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

  @Override
protected 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. 从网页上抓取Windows补丁信息然后整型输出(Python)
  2. ACM/ICPC 之 平面几何-两直线关系(POJ 1269)
  3. Ubuntu13.04配置:Vim+Syntastic+Vundle+YouCompleteMe
  4. 怎样用ZBrush中的Curves和Insert笔刷创建四肢
  5. 妙味课堂——HTML+CSS(第一课)
  6. UVa 10859 Placing Lampposts
  7. NYoj WAJUEJI which home strong!(简单搜索)
  8. codeforces 6A. Triangle
  9. ESFramework 4.0 快速上手(06) -- Rapid引擎(续)
  10. arm指令bne.w改成b,即无条件跳转
  11. Python数据分析与可视化(经典学习资料)
  12. Linux Mint如何添加windows分享的网络打印机?
  13. 用递归方法计算斐波那契数列(Recursion Fibonacci Sequence Python)
  14. 伪分布式&amp;&amp;完全分布式&amp;&amp;高可用(zookeeper)的配置文件内容
  15. Microsoft&#174; SQL Server&#174; 2012 功能包
  16. linux下的wireshark最新版安装(源码安装)以及一些常见问题
  17. 2017php经典面试题
  18. WCF使用net.tcp绑定时的注意事项
  19. python面向对象之类成员修饰符
  20. [精通Python自然语言处理] Ch1 - 将句子切分为单词

热门文章

  1. Mina框架与Spring整合配置文件
  2. PE文件结构(四) 输出表
  3. Linux/UNIX先进I/O
  4. Simditor图片上传
  5. IIS7安装场景对照表
  6. Android 源码编译
  7. Open the Lock
  8. AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
  9. JAVA类型修饰符(public,protected,private,friendly)
  10. 浅谈JavaScript中的字符串操作