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
。
我正在使用 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
。