豆沙包

          …… …… 所學 所寫 所想 所做 所悟…… ……

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

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

              
          return sourceClassName;
              }
                繼續
          // 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
          ++;
              }

          ………………
          ………………
                直至這兒,我們終于可以松一口氣了,因為我們已經找到了其中的關鍵
              StackTraceElement stack[] = (new Throwable()).getStackTrace();
             
                沒錯,就是這個StackTraceElement數組記載了我們想要的信息(類名,方法名等),這和我們用到的Exception類中的顯示調用棧是一個道理的。

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

                我們來看一個小例子
          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)

                我們亦可以通過這樣一個簡單地實例化一個Throwable來獲取相應的call strack。
                不過,一般的應用級程序里面不太會用到它,可能在工具級軟件里面用得多一點了:)

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

          評論

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

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

          主站蜘蛛池模板: 肥城市| 湖南省| 容城县| 东平县| 拜城县| 志丹县| 靖江市| 金溪县| 康马县| 会宁县| 潮安县| 都兰县| 四子王旗| 黎城县| 馆陶县| 宁蒗| 海兴县| 水城县| 黑河市| 翁牛特旗| 革吉县| 博爱县| 孙吴县| 华蓥市| 资溪县| 罗平县| 宁海县| 资中县| 泽库县| 蛟河市| 德庆县| 荔波县| 黑山县| 宁远县| 栾城县| 通州区| 夏河县| 紫云| 临沭县| 揭西县| 蓬安县|