亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

線程運行棧信息的獲取

2019-11-18 12:18:17
字體:
來源:轉載
供稿:網友

    一、問題的引入

    我們在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的時代,也只能這么做了。

二、Log4J 1.2的相關實現

Log4J 1.2是JDK1.3時代的作品。我們來看相關源代碼。

[code]

/**

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);

…. // 這里的代碼省略

}

[/code]

這里我們可以看到整體的實現思路。

首先,t.printStackTrace(pw); 獲得stack trace字符串。這個t是 new Throwable()的結果。用戶程序調用Log4J方法之后,Log4J自己又進行了4次調用,然后才獲得了 t = new 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)

那么,往下走4行,就可以回到用戶程序本身的調用信息:

at callers.fully.qualified.className.methodName(FileName.java:74)

這一行里面,類名、方法名、文件名、行號等信息全有了。解析這一行,就可以獲得需要的所有信息。

photoshop教程 數據結構 五筆輸入法專題 QQ病毒專題 共享上網專題 Google工具和服務專題



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
波霸ol色综合久久| 亚洲精品一区二区三区不| 中文字幕亚洲图片| 国产精品久久久久久久app| 亚洲女人天堂色在线7777| 97久久国产精品| 欧美激情喷水视频| 精品久久久久久久久中文字幕| 亚洲xxx自由成熟| 日韩激情视频在线播放| 亚洲娇小xxxx欧美娇小| 欧美电影在线免费观看网站| 亚洲国产古装精品网站| 欧美日韩视频在线| 午夜剧场成人观在线视频免费观看| 国产精品一区二区性色av| 国产精品视频最多的网站| 精品亚洲va在线va天堂资源站| 亚洲人成五月天| 亚洲精品国产综合区久久久久久久| 亚洲精品成人久久电影| 精品高清一区二区三区| 成人精品在线观看| 51精品国产黑色丝袜高跟鞋| 亚洲最大福利视频| 久久这里只有精品99| 91精品久久久久久久久久| 色在人av网站天堂精品| 成人午夜一级二级三级| 亚洲美女福利视频网站| 国产精品白嫩美女在线观看| 亚洲精品一区av在线播放| 久久久久久亚洲精品| 国产视频一区在线| 亚洲免费高清视频| 91夜夜揉人人捏人人添红杏| 亚洲欧美综合区自拍另类| 亚洲丝袜在线视频| 91在线观看欧美日韩| 国产精品视频99| 91久久久久久久久久久久久| 欧美激情女人20p| 日韩精品在线私人| 久久久亚洲国产天美传媒修理工| 亚洲精品成人免费| 国产精品视频导航| 欧美高清视频在线观看| 欧美国产中文字幕| 欧美性极品xxxx做受| 综合136福利视频在线| 亚洲а∨天堂久久精品9966| 国产精品久久久久久久久粉嫩av| 日本高清+成人网在线观看| 不卡av在线网站| 国产精品极品尤物在线观看| 日韩欧美在线视频| 精品中文字幕在线2019| 中文字幕欧美精品日韩中文字幕| 亚洲精品午夜精品| 欧美精品18videos性欧| 国产欧美日韩91| 91理论片午午论夜理片久久| 中文字幕欧美精品在线| 色777狠狠综合秋免鲁丝| 久久成人一区二区| 日韩美女毛茸茸| 亚洲r级在线观看| 91精品中国老女人| 欧美黑人又粗大| 国产精品69久久久久| 在线看日韩欧美| 精品国产999| 精品日本美女福利在线观看| 91九色国产社区在线观看| 日韩有码在线播放| 国外日韩电影在线观看| 久久精品久久久久电影| 97在线视频免费| 81精品国产乱码久久久久久| 91免费看片在线| 久久免费福利视频| 欧美xxxx综合视频| 国产精品女人久久久久久| 日韩高清欧美高清| 欧美成人免费全部| 欧美xxxx18性欧美| 亚洲福利精品在线| 欧美日韩一区二区免费视频| 日本不卡免费高清视频| 欧美色播在线播放| 97在线视频一区| 成人久久久久爱| 日韩美女中文字幕| 国产mv久久久| 91av在线播放| 欧美激情一区二区三区在线视频观看| 亚洲电影免费在线观看| 国模精品一区二区三区色天香| 日本一区二三区好的精华液| 欧美日韩ab片| 色与欲影视天天看综合网| 欧美视频一区二区三区…| 日韩欧美在线字幕| 亚洲www永久成人夜色| 国产精品电影观看| 国产成人精品免高潮在线观看| 啪一啪鲁一鲁2019在线视频| 亚洲欧美变态国产另类| 在线日韩av观看| 亚洲日本欧美日韩高观看| 日韩精品在线观看一区| 性亚洲最疯狂xxxx高清| 国产视频在线一区二区| 4438全国亚洲精品在线观看视频| 国产精品久久精品| 色偷偷噜噜噜亚洲男人| 国产免费一区二区三区在线能观看| 亚洲免费av网址| 欧美日韩另类视频| 国产精品久久网| www欧美xxxx| 欧美在线视频网站| 欧美激情综合色| 久久成人18免费网站| 热99精品只有里视频精品| 日韩欧美高清视频| 国产一区二区免费| 亚洲国产欧美一区二区三区久久| 一区二区欧美激情| 国产精品91在线| 日韩成人在线视频网站| 国产福利精品在线| 成人免费视频xnxx.com| 成人午夜激情网| 亚洲第一福利视频| 欧美片一区二区三区| 欧美性猛交xxxx乱大交3| 亚洲第一页中文字幕| 亚洲国产高清高潮精品美女| 日韩视频永久免费观看| 亚洲国产精品国自产拍av秋霞| 黑人巨大精品欧美一区免费视频| 国产日韩欧美综合| 成人有码在线播放| 国产精品视频自在线| 美女福利精品视频| 久久综合免费视频| 亚洲最大中文字幕| 日韩免费av片在线观看| 中文字幕视频一区二区在线有码| 午夜精品久久久99热福利| 日韩在线资源网| 国产精品人人做人人爽| 日韩精品免费综合视频在线播放| 国产精品一区二区三| 欧美日韩国产一区二区三区| 欧美一级电影在线| 欧美精品videos另类日本| 欧美午夜精品伦理| 亚洲在线免费视频| 一区二区三区视频在线| 亚洲精品国产免费| 国产精品久久久av| 国产精自产拍久久久久久蜜|