Zum besseren Debuggen erzeugt, würde ich oft haben mag:Wie dynamisch einen Stapelrahmen mit Debug-Log-Informationen
Exception
at com.example.blah.Something.method()
at com.example.blah.Xyz.otherMethod()
at com.example.hello.World.foo()
at com.example.debug.version_3_8_0.debug_info_something.Hah.method() // synthetic method
at com.example.x.A.wrappingMethod()
Der Debug-Stack-Frame wie oben wie ein java.lang.reflect.Proxy
dynamisch generiert werden, nur gezeigt würde, es sei denn dass ich die vollständige Kontrolle über den vollständigen, vollständigen Methodennamen, der auf dem Proxy endet, haben möchte.
Am Aufrufort, würde ich etwas dumm und einfach, wie dies tun:
public void wrappingMethod() {
run("com.example.debug.version_3_8_0.debug_info_something.Hah.method()",() -> {
World.foo();
});
}
Wie Sie sehen können, die wrappingMethod()
ist eine echte Methode, die auf dem Stack-Trace endet, Hah.method()
eine dynamisch generierte Methode, während World.foo()
ist wieder eine echte Methode.
Ja, ich weiß, das verunreinigt die bereits tiefen Deep Stack Spuren. Mach dir keine Sorgen darüber. Ich habe meine Gründe.
Gibt es eine (einfache) Möglichkeit, dies oder etwas Ähnliches wie oben beschrieben zu machen?
Ich bin nicht sehr vertraut mit der Gegend, aber ich weiß, dass so etwas auf Bytecode-Ebene getan werden kann, aber ich bin mir nicht sicher, ob es in der Sprache möglich ist. –
@ Meguy26: Ich bin mit Bytecode-Level-Lösungen in Ordnung, wenn sie ohne besondere Abhängigkeiten außerhalb des JDK implementiert werden können. Obwohl ich auch funktionierende Lösungen akzeptiere, die eine Abhängigkeit wie Bytebuddy verwenden –