2017-02-24 5 views
1

Javassistを使用してjbackにログバック・ロガーを注入しようとしています。ロガーのパターンでJavassistの行番号が正しくない

、I等ファイル、時間、スレッドのような他の詳細の中の行番号を記録してい

ctMethod.insertAfter()

を用いて注射した場合に生成されるログの行番号が正しいです。しかし、ctMethod.insertbefore()を使用して注入すると、行番号は-1と記録されます。

どうしてですか?そして私はこれをどのように解決できますか?

答えて

2

これは、Javassist自身がコードに行番号情報を追加しないためです。 Javaバイトコード内では、行番号情報は行の始まりに関する情報を介して表されます。 Javassistのは、そのような情報を変更したり、追加していないので何も情報がinsertBeforeコードがご利用されていないのに対し、insertAfterコードは、最後の行に配置されているかのように、それが表示されます。

何らかの方法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を追加し、それぞれのラインにコードを追加することでこの問題を回避することができます。あなたがAdviceコンポーネントを使用してコードを追加できる場所別の方法として、あなたは、コードの操作のためのバイトバディを使用することができます。 insertBefore同等のは、あなたがやりたいんtakes a property prependLineNumber@OnMethodEnter注釈です。デフォルトではtrueに設定されています。

関連する問題