封装在一个辅助方法获取方法的名称
问题描述:
出于调试的目的有我的代码的一部分中,我要记录一个方法的名称,如:封装在一个辅助方法获取方法的名称
val LOG = LogManager.getLogger(SomeClass::class.java.name)
//...
fun someMethod() {
LOG.debug(Thread.currentThread().getStackTrace()[1].getMethodName())
我怎么能有这样的作为最小但清晰的表达?就像:
LOG.debug(getMethodName())
顺便说一下,我尝试使用AspectJ为此,但我使用Eclipse和Kotlin插件与1.1.1一起使用。 AspectJ需要KAPT(据我所知),它不适用于1.1.1的maven(我也在使用它)。
答
您可以定义在线程的扩展功能,让你在栈上的第一种方法:
fun Thread.firstStackMethod() = stackTrace[1].methodName
这样称呼它,那么:
LOG.debug(Thread.currentThread().firstStackMethod())
也许它甚至有一个很好的选择,为你直接扩展记录器:
fun Logger.debugMethodName(t: Thread) = debug(t.stackTrace[1].methodName)
//use
LOG.debugMethodName(Thread.currentThread())
答
您可以在文件级创建功能。
fun getMethodName(): String =
Thread.currentThread().stackTrace[1].methodName
class Foo {
...
}
通过调整stackTrace
数字,您可以得到您想要的级别。