我正在使用Javassist将注册记录器注入jar。
在记录器的模式中,我记录行号,时间,线程,文件等其他细节。
使用ctMethod.insertAfter()
注入时生成的日志的行号是正确的。但是,使用ctMethod.insertbefore()
注入时,行号将记录为-1
。
为什么会这样?我该如何解决这个问题?
答案 0 :(得分:3)
这是因为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
。