目的是建立一个“ 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
可以实现,但是
在编写代码时,我总是应该记住并考虑它,我
想避免。 StackWalker
所以我认为这在某种程度上是可以通过反射实现的,java最好不要依赖于kotlin-reflection包。