Javassist插入行号不正确

时间:2017-02-24 11:50:29

标签: java logback instrumentation javassist

我正在使用Javassist将注册记录器注入jar。

在记录器的模式中,我记录行号,时间,线程,文件等其他细节。

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

为什么会这样?我该如何解决这个问题?

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