如何获取call stack(调用栈)信息——之二

如何获取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。
      不过,一般的应用级程序里面不太会用到它,可能在工具级软件里面用得多一点了:)

你可能感兴趣的:(如何获取call stack(调用栈)信息——之二)