长空待击

« Previous day (九月 7, 2006) | Main | Next day (九月 9, 2006) »

http://blog.matrix.org.cn/xMatrix/date/20060908 星期五 2006年09月08日

如何在代码中输出代码所有的类及其代码行(从log4j想起的)



在使用log4j时,对其在错误时候打印的错误信息很感兴趣,能够详细的给出具体的错误信息和具体的代码位置。通常我们在代码中会增加一些调试信息,便于定位问题,在项目比较小时还是比较方便,可当项目成长起来,类似的调试信息可能存在于多个地方,或者想不起来这个调试信息是哪个方法用的。这时,如果能具体地给出调试信息所有在的类及其代码行,就方便多了。
可如何来得到当前代码所在的类和代码行,一个方法就是写死了,可是以后修改代码后就需要时时更新,这个工作量可不小。另外就是动态地提供类及其代码行,Google了一下,好像是没有相关的API。我知道通过解析类文件,是可以得到相关的信息的,可是我在代码中可以这样做吗?理论上没有问题,不过实现起来可能就比较麻烦了.
那么就来看一下log4j的源程序吧,可是找了半天,也找不到相关的处理代码。难道说log4j根本没有做相关的工作。事实就是这样,我们绕了一圈才发现真理就在眼前,可我们就是看不见。
呵呵,其实就是这么简单,Throwable类已经提供了这样的方法,log4j只是调用了Throwable.toString()方法而已,这样一切就变得简单多了,我们通过Throwable来实现这个功能吧:

public abstract class LogUtil {

    public static String wrapInfo(String info) {
        StringBuffer buffer = new StringBuffer();
        buffer.append(info).append("\r\n").append(new Exception().getStackTrace()[1]);
        return buffer.toString();
    }
    
}

很简单吧,我们不需要完整的异常椎栈,所以只取[1]的信息(即调用本方法的类的方法的信息)


Valid HTML! Valid CSS!

This is a personal weblog, I do not speak for my employer.