Получить имя окружающего класса косвенно - PullRequest
0 голосов
/ 22 февраля 2019

Цель состоит в том, чтобы создать значение «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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...