豆沙包

          …… …… 所學(xué) 所寫 所想 所做 所悟…… ……

          如何獲取call stack(調(diào)用棧)信息——之二

            從這兒可以看到:注意如果客戶端程序沒有顯式地指定源方法名和源類名,則LogRecord 類將通過分析 call stack(調(diào)用棧)來自動(dòng)提取這些信息(方法getSourceMethodname和方法getSourceClassName),我們已經(jīng)走在正確的道路上了,繼續(xù)追查getSourceMethodname()…………
                   
              public String getSourceClassName() {
              
          if (needToInferCaller) {
                  inferCaller();
              }

              
          return sourceClassName;
              }
                繼續(xù)
          // Private method to infer the caller's class and method names
              private void inferCaller() {
              needToInferCaller 
          = false;
              
          // Get the stack trace.
              StackTraceElement stack[] = (new Throwable()).getStackTrace();
              
          // First, search back to a method in the Logger class.
              int ix = 0;
              
          while (ix < stack.length) {
                  StackTraceElement frame 
          = stack[ix];
                  String cname 
          = frame.getClassName();
                  
          if (cname.equals("java.util.logging.Logger")) {
                  
          break;
                  }

                  ix
          ++;
              }

          ………………
          ………………
                直至這兒,我們終于可以松一口氣了,因?yàn)槲覀円呀?jīng)找到了其中的關(guān)鍵
              StackTraceElement stack[] = (new Throwable()).getStackTrace();
             
                沒錯(cuò),就是這個(gè)StackTraceElement數(shù)組記載了我們想要的信息(類名,方法名等),這和我們用到的Exception類中的顯示調(diào)用棧是一個(gè)道理的。

                注意:這兒通過創(chuàng)建一個(gè)Throwable實(shí)例,并利用在Throwable類中提供這個(gè)getStackTrace()方法,返回是StackTraceElement數(shù)組來獲取到了調(diào)用棧信息。

                我們來看一個(gè)小例子
          public class CallStack {
              String showTrace() 
          {
                  
          return new Throwable().getStackTrace()[0].toString();
              }


              
          public static void main(String[] args) {
                  System.
          out.println(new CallStack().showTrace());
              }

          }

                
                打印如下
                chapter5.CallStack.showTrace(CallStack.java:5)

                我們亦可以通過這樣一個(gè)簡(jiǎn)單地實(shí)例化一個(gè)Throwable來獲取相應(yīng)的call strack。
                不過,一般的應(yīng)用級(jí)程序里面不太會(huì)用到它,可能在工具級(jí)軟件里面用得多一點(diǎn)了:)

          posted on 2005-03-13 18:25 carob 閱讀(4559) 評(píng)論(1)  編輯  收藏 所屬分類: Reflection

          評(píng)論

          # re: 如何獲取call stack(調(diào)用棧)信息——之二 2010-09-17 16:05 rtrt

          private void printCallStack2(){
          try{
          throw new RuntimeException();
          }catch(RuntimeException e){
          e.printStackTrace();
          }
          }  回復(fù)  更多評(píng)論   

          主站蜘蛛池模板: 延安市| 赞皇县| 天门市| 镇巴县| 潍坊市| 达孜县| 舒兰市| 凤冈县| 彝良县| 青海省| 阳城县| 孟州市| 康定县| 德格县| 偃师市| 新龙县| 崇仁县| 洞头县| 东丽区| 光泽县| 交城县| 普兰县| 阳东县| 正镶白旗| 根河市| 错那县| 信阳市| 临猗县| 东乌| 许昌县| 永昌县| 井研县| 石柱| 来安县| 新龙县| 勐海县| 晋宁县| 顺平县| 呼伦贝尔市| 涿州市| 普洱|