2017-02-24 36 views
1

我正在使用Javassist將一個logback記錄器注入到jar中。Javassist插入行號不正確

在記錄器的模式,我喜歡錄製時間等細節中的行號,線程,文件等

使用ctMethod.insertAfter()注射時生成的日誌的行號是正確的。但是當使用ctMethod.insertbefore()注入時,行號被記錄爲-1

爲什麼會發生這種情況?我該如何解決這個問題?

回答

2

發生這種情況是因爲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