当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:12:00  来源:本站整理

<b>Java线程运行栈信息的得到</b>[Java编程]

赞助商链接



  本文“<b>Java线程运行栈信息的得到</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

1、问题的引入

我们在Java程序中利用日记功效(JDK Log大概Log4J)的时刻,会发现Log系统会自动帮我们打印出丰富的信息,格局普通以下:

[运行时间] [当前类名] [办法名]

INFO: [用户信息]

具体例子如Tomcat启动信息:

Jul 9, 2004 11:22:41 AM org.apache.coyote.http11.Http11Protocol start

INFO: Starting Coyote HTTP/1.1 on port 8080

看起来这毫无奇异之处,不就是打印了一条信息吗?但假如好奇心重一点,追寻背面的实现原理,会发现这确切很奇异.

上面的Log信息的[当前类名] [办法名]部份 不是用户自己增添的,而是Log系统自动增添的.这意味着Log系统可以自动判断当前履行语句是哪个类的哪个办法.这是若何做到的?

我们翻遍java.lang.reflection package,幻想着找到一个Statement语句级别的Reflection类,通过这个Statement对象得到Method,然后通过这个Method得到declared Class.这不就得到对应的Class和Method信息了吗?这是一个不错的假想,但也只能是一个假想;因为没有这个Statement对象.

再想一下.对了,Java不是有一个Thread类吗?Thread.currentThread()办法获得当前线程,我们能不能通过这个当前线程获得当前运行的Method和Class呢?很遗憾,假如你还在用JDK1.4或以下版本,那么找不到这样的办法.(JDK1.5的情形背面会讲)

再想一下.对了,我们都有很深化的印象,当系统抛出Exception的时刻,老是打印出一串的信息,奉告我们Exception发生的位置,和一层一层的调用关系.我们也可以自己调用Exception的printStackTrace()办法来打印这些信息.这不就是当前线程运行栈的信息吗?找到了,就是它.

Exception的printStackTrace()办法担当自Throwable,那么我们来看一下,JDK的Throwable的printStackTrace()办法是若何实现的.

我们先来看JDK1.3的源代码,会发现Throwable.printStackTrace()办法调用了一个native printStackTrace0()办法.我们找不到任何线索,可以用在我们自己的Java代码中.

那怎么办?Throwable.printStackTrace()的输出后果字符串里面不是包含了当前线程运行栈的全部信息吗?我们可以从这个字符串中抽取自己需求的信息.JDK1.3的时代,也只能这么做了.

2、Log4J 1.2的相关实现

Log4J 1.2是JDK1.3时代的作品.我们来看相关源代码.

以下内容为程序代码 以下内容为程序代码

/**
Instantiate location information based on a Throwable. We
expect the Throwable t, to be in the format
java.lang.Throwable
...
at org.apache.log4j.PatternLayout.format(PatternLayout.java:413)
at org.apache.log4j.FileAppender.doAppend(FileAppender.java:183)
at org.apache.log4j.Category.callAppenders(Category.java:131)
at org.apache.log4j.Category.log(Category.java:512)
at callers.fully.qualified.className.methodName(FileName.java:74)
...
*/
public LocationInfo(Throwable t, String fqnOfCallingClass) {
String s;

t.printStackTrace(pw);
s = sw.toString();
sw.getBuffer().setLength(0);
…. // 这里的代码省略
}


  以上是“<b>Java线程运行栈信息的得到</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .