2015-09-22 27 views
3

我想獲取Scala應用程序中的函數內的調用方類和方法名稱。我目前正在使用堆棧跟蹤,但性能下降。我做這樣的事情獲取來電者類和方法名稱

stackTrace(CodeDepth).getClassName 
stackTrace(CodeDepth).getMethodName 

我已經找到了Java反射多很多更快,但我只能用

sun.reflect.Reflection.getCallerClass(CodeDepth).getName() 

獲取類名是有沒有辦法獲得方法名(和可選的行號)通過反射?也許使用Scala的反射?

感謝

+0

我認爲這是你正在尋找的東西:http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html – nafas

+0

可能的重複[Get callers method(java.lang .reflect.Method)](http://stackoverflow.com/questions/4024587/get-callers-method-java-lang-reflect-method) –

+0

@nafas不,使用Throwable也很貴。請參閱http://stackoverflow.com/questions/421280/how-do-i-find-the-caller-of-a-method-using-stacktrace-or-reflection以供參考。 – sebi

回答

3

不幸的是,這樣做沒有 -expensive方法。有一個Java Enhancement Proposal添加更好的選擇,但這並沒有幫助,除非你可以等到Java 9(並且它不保證被包含在內)。

另一方面,這真的是你的代碼中的熱點嗎?這隻應該在循環中調用時才重要,在這種情況下,您可以調用它一次並緩存結果。

+0

是的,它是一個熱點。這是一個在我們的應用程序中位於logback之上的事件框架。我想知道在事件進入logback之前事件產生的方法和行號,這樣我就可以將它傳遞給不同格式的工具,如Kafka。我知道logback有這個信息(至少是行號),而且速度很快,所以理論上它有可能... – sebi

+0

嗯,logback使用堆棧跟蹤https://github.com/qos-ch/logback/blob/ d46efd0ebd856924a51b9638cc374687c6f438c8/logback-classic/src/main/java/ch/qos/logback/classic/spi/ILoggingEvent.java並在文檔中特別警告「生成方法名稱並不是特別快」。 –

+0

如果logback已經爲你捕獲了這個信息,你至少可以避免通過編寫你自己的編碼器來獲得堆棧跟蹤兩次,它將監聽ILoggingEvent的http://logback.qos.ch/manual/encoders.html –