2015-09-22 2 views
3

Я пытаюсь получить класс вызывающего и имя метода внутри функции в приложении Scala. В настоящее время я использую трассировку стека, но производительность уменьшилась. Я делаю что-то вродеПолучить класс и метод вызова

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

Я нашел отражение Java, чтобы быть намного более быстрым, но я могу получить только имя класса с

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

Есть ли способ, чтобы получить имя методы (и, необязательно, номер строки) через отражение? Может быть, используя отражение Скалы?

Благодаря

+0

Я думаю, что это то, что вы ищете: http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html – nafas

+0

Возможный дубликат метода [Get callers (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

Да, это горячая точка. Это среда для событий, которая находится поверх логарифма в нашем приложении. Я хотел бы знать метод и номер строки, в которой событие было создано до того, как событие поступит в журнал, так что я могу подключить его к инструментам вроде Kafka в разных форматах. Я знаю, что logback имеет эту информацию (номер строки, по крайней мере), и это довольно быстро, поэтому теоретически это возможно ... – sebi

+0

Ну, журнал использует трассировку стека 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 –

Смежные вопросы