Цель состоит в том, чтобы создать значение «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
, но вы всегда должны помнить это и учитывать при написании кода, который я хочуизбежать. - Я знаю, это может быть сделано с получением трассировки стека, но это очень медленный и не очень надежный источник.Ведение журнала должно быть как можно скорее и не влияет на скорость приложения.
- Среда - JVM 7, к сожалению, я не могу использовать
StackWalker
Так что я думаю, что это как-то возможно с отражением,Ява предпочтительнее, чтобы не зависеть от пакета Kotlin-Reflection.