我正在使用Javassist将一个logback记录器注入到jar中。Javassist插入行号不正确
在记录器的模式,我喜欢录制时间等细节中的行号,线程,文件等
使用ctMethod.insertAfter()
注射时生成的日志的行号是正确的。但是当使用ctMethod.insertbefore()
注入时,行号被记录为-1
。
为什么会发生这种情况?我该如何解决这个问题?
我正在使用Javassist将一个logback记录器注入到jar中。Javassist插入行号不正确
在记录器的模式,我喜欢录制时间等细节中的行号,线程,文件等
使用ctMethod.insertAfter()
注射时生成的日志的行号是正确的。但是当使用ctMethod.insertbefore()
注入时,行号被记录为-1
。
为什么会发生这种情况?我该如何解决这个问题?
发生这种情况是因为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
。