间接获取封闭类的名称

时间:2019-02-22 10:57:53

标签: java reflection kotlin

目的是建立一个“ TAG”值,该值有助于记录和调试。基本上,当我们执行日志记录时,我们对顶级封闭类的名称感兴趣,而不是对使用的类或内部的类感兴趣,以了解操作的上下文。

这是我的代码段,该代码段可与匿名和内部程序配合使用,但在具有接收器的功能上失败:

B级

class A {

    fun test() {
        B().apply {
            //get "A" string here
            println("$TAG: log message")
        }
    }
}

val Any.TAG: String
    get() = getTopLevelClass(this.javaClass).simpleName

private fun getTopLevelClass(clazz: Class<*>): Class<*> =
    clazz.enclosingClass?.let { getTopLevelClass(it) } ?: clazz

它输出B,但是并没有给我太多有关使用它的上下文的信息

  • 我知道,this@A.TAG可以实现,但是 在编写代码时,我总是应该记住并考虑它,我 想避免。
  • 我知道,可以通过获取stacktrace来完成,但是 是非常慢的,不是真正值得信赖的来源。记录应该是 尽快并且不会影响应用速度。
  • 环境是JVM 7,不幸的是我无法使用StackWalker

所以我认为这在某种程度上是可以通过反射实现的,java最好不要依赖于kotlin-reflection包。

0 个答案:

没有答案