我正在使用Javassist將一個logback記錄器注入到jar中。Javassist插入行號不正確
在記錄器的模式,我喜歡錄製時間等細節中的行號,線程,文件等
使用ctMethod.insertAfter()
注射時生成的日誌的行號是正確的。但是當使用ctMethod.insertbefore()
注入時,行號被記錄爲-1
。
爲什麼會發生這種情況?我該如何解決這個問題?
我正在使用Javassist將一個logback記錄器注入到jar中。Javassist插入行號不正確
在記錄器的模式,我喜歡錄製時間等細節中的行號,線程,文件等
使用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
的相應行添加代碼來避免此情況。或者,您可以使用Byte Buddy進行代碼處理,您可以使用Advice
組件添加代碼。 insertBefore
等價物是@OnMethodEnter
註釋,其中takes a property prependLineNumber
可以做你想做的事情。它默認設置爲true
。