2017-09-14 53 views
0

出于调试的目的有我的代码的一部分中,我要记录一个方法的名称,如:封装在一个辅助方法获取方法的名称

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(我也在使用它)。

回答

1

您可以定义在线程的扩展功能,让你在栈上的第一种方法:

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()) 
2

您可以在文件级创建功能。

fun getMethodName(): String = 
    Thread.currentThread().stackTrace[1].methodName 

class Foo { 
    ... 
} 

通过调整stackTrace数字,您可以得到您想要的级别。