Javassist insertbefore 行号不正确

Javassist insertbefore line number incorrect

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

在记录器模式中,我记录了行号以及时间、线程、文件等其他详细信息

使用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. Alternatively, you can use Byte Buddy for code manipulation where you can add code using the Advice component. The insertBefore equivalent is the @OnMethodEnter annotation which takes a property prependLineNumber 的相应行添加代码来避免这种情况,该代码确实可以满足您的要求。默认设置为 true