2017-02-24 99 views
1

我正在使用Javassist将一个logback记录器注入到jar中。Javassist插入行号不正确

在记录器的模式,我喜欢录制时间等细节中的行号,线程,文件等

使用ctMethod.insertAfter()注射时生成的日志的行号是正确的。但是当使用ctMethod.insertbefore()注入时,行号被记录为-1

为什么会发生这种情况?我该如何解决这个问题?

回答

2

发生这种情况是因为Javassist本身不会将任何行号信息添加到其代码中。在Java字节码中,行号信息通过关于行开始的信息来表示。由于Javassist不会更改或添加此类信息,因此看起来insertAfter代码位于最后一行,而insertBefore代码没有可用信息。

鉴于一些方法foo,Javassist是将添加代码如下面的伪代码示例:

void foo() { 
    // inserted before - in line number information 
    // start line number 1 
    // original code 
    // start line number 2 
    // original code 
    // inserted after - still on line number 2 
} 

作为偏移现在被置于的insertBefore代码后,后者代码并不意味着任何行号信息(用值-1表示)。由于insertAfter代码隐式地放置在最后一个偏移量之后,因此它看起来好像置于最后一行内。

您可以通过在Javassist添加代码after the line number information using insertAt的相应行添加代码来避免此情况。或者,您可以使用Byte Buddy进行代码处理,您可以使用Advice组件添加代码。 insertBefore等价物是@OnMethodEnter注释,其中takes a property prependLineNumber可以做你想做的事情。它默认设置为true