出于调试目的,我的代码中有一部分要记录方法的名称,如下所示:
*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(我也使用)。
答案 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())