封装在辅助方法中获取方法的名称

时间:2017-09-14 00:25:16

标签: logging kotlin log4j2

出于调试目的,我的代码中有一部分要记录方法的名称,如下所示:

*ptr

我怎样才能将它作为一个最小但易读的表达方式?类似的东西:

val LOG = LogManager.getLogger(SomeClass::class.java.name)
//...
fun someMethod() {
   LOG.debug(Thread.currentThread().getStackTrace()[1].getMethodName())

顺便说一句,我尝试使用AspectJ,但我使用的是Eclipse,而Kotlin插件适用于1.1.1。 AspectJ需要KAPT(据我所知),这对于1.1.1不适用于maven(我也使用)。

2 个答案:

答案 0 :(得分:2)

您可以在文件级别创建一个函数。

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

class Foo {
    ...
}

通过调整stackTrace号码,您可以获得所需的级别。

答案 1 :(得分:1)

你可以在Thread上定义一个扩展函数,它为你提供堆栈的第一个方法:

  File "try.py", line 268, in <module>
    ws = websocket.create_connection(full_url, headers_conn1)
  File "/usr/local/lib/python2.7/dist-packages/websocket/_core.py", line 487, in create_connection
    websock.connect(url, **options)
  File "/usr/local/lib/python2.7/dist-packages/websocket/_core.py", line 211, in connect
    options.pop('socket', None))
  File "/usr/local/lib/python2.7/dist-packages/websocket/_http.py", line 71, in connect
    sock = _open_socket(addrinfo_list, options.sockopt, options.timeout)
  File "/usr/local/lib/python2.7/dist-packages/websocket/_http.py", line 106, in _open_socket
    sock.settimeout(timeout)
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
TypeError: a float is required

然后这样称呼:

fun Thread.firstStackMethod() = stackTrace[1].methodName

也许它甚至是您直接扩展Logger的好选择:

LOG.debug(Thread.currentThread().firstStackMethod())