豆沙包

…… …… 所学 所写 所想 所做 所悟…… ……

如何获取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 阅读(4542) 评论(1)  编辑  收藏 所属分类: Reflection

评论

# re: 如何获取call stack(调用栈)信息——之二 2010-09-17 16:05 rtrt

private void printCallStack2(){
try{
throw new RuntimeException();
}catch(RuntimeException e){
e.printStackTrace();
}
}  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: