Pour une meilleure mise au point, je voudrais souvent avoir:Comment générer dynamiquement un cadre de pile avec des informations de journal de débogage
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()
Le cadre de la pile de débogage comme indiqué ci-dessus serait généré dynamiquement, tout comme un java.lang.reflect.Proxy
, à l'exception que je voudrais être en contrôle total du nom complet de la méthode entièrement qualifié qui finit sur le proxy.
Sur le site d'appel, je fais quelque chose de stupide et simple que cela:
public void wrappingMethod() {
run("com.example.debug.version_3_8_0.debug_info_something.Hah.method()",() -> {
World.foo();
});
}
Comme vous pouvez le voir, le wrappingMethod()
est une vraie méthode qui se termine sur la trace de la pile, Hah.method()
est une dynamique générée méthode, alors que World.foo()
est encore une vraie méthode. Oui, je sais que cela pollue les traces de pile profondes déjà profondes. Ne t'en fais pas pour ça. J'ai mes raisons.
Existe-t-il une façon (simple) de faire ceci ou quelque chose de similaire à ce qui précède?
Je ne suis pas très familier avec la zone, mais je sais que quelque chose comme ça peut être fait au niveau du bytecode, mais je ne suis pas sûr que ce soit possible dans la langue. –
@ Meguy26: Je suis d'accord avec les solutions de niveau bytecode si elles peuvent être implémentées sans dépendance particulière en dehors du JDK. Bien, j'accepterais aussi des solutions de travail qui utilisent une dépendance comme Bytebuddy –