Dies passiert, weil Javassist selbst keine Zeilennummerinformationen zu seinem Code hinzufügt. Innerhalb des Java-Byte-Codes wird die Zeilennummerinformation durch Information über den Anfang einer Zeile ausgedrückt. Da Javassist solche Informationen nicht ändert oder hinzufügt, scheint es, als ob der Code in der letzten Zeile steht, während für den Code insertBefore
keine Informationen verfügbar sind.
Da einige Verfahren foo
, Javassist den Code wie in dem folgenden Pseudocodebeispiel hinzufügen würde:
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
}
Da die jetzt versetzt nach dem insertBefore
Code platziert wird, wird das letztere Code keine Zeilennummerinformationen implizieren (ausgedrückt durch den Wert -1
). Da der insertAfter
Code implizit nach dem letzten Offset platziert wird, scheint es, als ob er in der letzten Zeile platziert wurde.
Sie können dies vermeiden, indem Sie Code in der entsprechenden Zeile hinzufügen, in der Javassist den Code after the line number information using insertAt
hinzufügt. Alternativ können Sie Byte Buddy für die Code-Manipulation verwenden, wo Sie Code mit der Komponente Advice
hinzufügen können. Die insertBefore
Entsprechung ist die @OnMethodEnter
Annotation, die takes a property prependLineNumber
was tun, was Sie wollen. Es ist standardmäßig auf true
eingestellt.