注意到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
*************************************
这次的输出就只有主函数信息,先就写到这里了。