java怎样得到运行时程序的行号

来源:互联网 发布:ali个人域名怎么转企业 编辑:程序博客网 时间:2024/06/08 11:54

     注意到log4j可以输出代码的行号,我就感到很奇怪,log4j是怎样输出代码的行号的?带着这个疑问,到网上找了一些列子,才发现原来是这个样子,具体是怎么一回事,就听我下面细细道来,不要怪我文笔太差,希望大家多多的指教。

    先来看下下面的代码:

  StackTraceElement[] elements = Thread.currentThread().getStackTrace();for(StackTraceElement element : elements){System.out.println("className : " + element.getClassName());System.out.println("fileName : " + element.getFileName());System.out.println("lineNumber : " + element.getLineNumber());System.out.println("methodName : " + element.getMethodName());System.out.println("*************************************");}

  运行可以得到如下的输出:

className : java.lang.Thread
fileName : Thread.java
lineNumber : 1479
methodName : getStackTrace
*************************************
className : com.warnow.test.StackTraceElementTest
fileName : StackTraceElementTest.java
lineNumber : 9
methodName : main
*************************************

  StackTraceElement到底是个什么样的对象,参看java api,可以看到这个类有这样的构造器StackTraceElement(String declaringClass, String methodName, String fileName, int lineNumber)在构造这个类的时候已经把相关的信息存进来了, StackTraceElement代表堆栈中的每个Element,用来存放类名,方法名,文件名,行号等信息。也可以通过 Throwable.getStackTrace()来获取StackTraceElement数组(存放的是所有的),通过StackTraceElement对象就可以获取到类名,文件名,运行的代码的行号,方法名。从上面的输出可以看出最后的那个StackTraceElement就是我们当前运行主函数。加入有类似如下的代码运行的结果会是怎样呢?

       //get all StackTraceElement instance.//StackTraceElement[] elements = Thread.currentThread().getStackTrace();StackTraceElement[] elements = new Throwable().getStackTrace();for(StackTraceElement element : elements){System.out.println("className : " + element.getClassName());System.out.println("fileName : " + element.getFileName());System.out.println("lineNumber : " + element.getLineNumber());System.out.println("methodName : " + element.getMethodName());System.out.println("*************************************");//System.out.println("class : " + element.getClass());//System.out.println("*****************************************************");//throw new RuntimeException("xxxx");}

    与上面不同这次同过Throwable.getStackTrace()来获取的输出结果如下:

                   className : com.warnow.test.StackTraceElementTest
                  fileName : StackTraceElementTest.java
                  lineNumber : 10
                 methodName : main
                *************************************

这次的输出就只有主函数信息,先就写到这里了。

0 0