2017-02-24 2 views
1

Ich injiziere eine Logback-Logger mit JavaSist in Jars.Javassist insertbefore Zeilennummer inkorrekt

Im Muster des Loggers, ich bin unter anderem Details wie Zeiterfassung Zeilennummer, Faden, usw. Datei

Die Zeilennummer der erzeugten Log korrekt ist, wenn ctMethod.insertAfter() injiziert werden. Bei der Injektion mit ctMethod.insertbefore() wird die Zeilennummer jedoch als -1 aufgezeichnet.

Warum passiert das? Und wie kann ich das auflösen?

Antwort

2

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.