爲了更好的調試,我會經常想有:如何動態地生成與調試日誌信息的堆棧幀
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()
調試堆棧幀,如上所示將動態生成的,就像一個java.lang.reflect.Proxy
,除了我希望完全控制代理上結束的完整限定方法名稱。
在調用點,我會做一些愚蠢的,這樣簡單:
public void wrappingMethod() {
run("com.example.debug.version_3_8_0.debug_info_something.Hah.method()",() -> {
World.foo();
});
}
正如你所看到的,wrappingMethod()
是堆棧跟蹤結束了一個真正的方法,是動態生成的方法,而World.foo()
又是一個真正的方法。
是的,我知道這會污染已經很深的堆棧痕跡。不要擔心。我有我的理由。
有沒有一種(簡單)的方法來做到這一點或類似於上述?
我對這個領域並不是非常熟悉,但是我知道類似的東西可以在字節碼級完成,但我不確定在語言中是否可行。 –
@ Meguy26:如果字節碼級別的解決方案可以在JDK之外沒有特殊的依賴關係實現,那麼我很好。雖然,我也會接受使用像Bytebuddy –