【问题标题】:Javassist insertbefore line number incorrectJavassist 在行号前插入不正确
【发布时间】:2017-02-24 11:50:29
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java logback instrumentation javassist


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      相关资源
      最近更新 更多