豆沙包

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

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

            從這兒可以看到:注意如果客戶端程序沒有顯式地指定源方法名和源類名,則LogRecord 類將通過分析 call stack(調(diào)用棧)來自動提取這些信息(方法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();
             
                沒錯,就是這個StackTraceElement數(shù)組記載了我們想要的信息(類名,方法名等),這和我們用到的Exception類中的顯示調(diào)用棧是一個道理的。

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

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

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

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

          評論

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

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

          主站蜘蛛池模板: 洪江市| 灵台县| 宝丰县| 宁化县| 承德市| 岑溪市| 大埔区| 佛学| 鄂尔多斯市| 阿合奇县| 大城县| 高邮市| 龙井市| 吉安市| 讷河市| 顺义区| 康乐县| 察雅县| 宜都市| 吴江市| 黑龙江省| 隆德县| 荆州市| 博野县| 泽普县| 台前县| 玉屏| 应城市| 琼结县| 宝山区| 隆林| 江山市| 汉寿县| 大兴区| 邹城市| 定安县| 察雅县| 伊宁县| 红桥区| 新竹县| 镇坪县|