Причина, по которой я спрашиваю, какие StackTraceElements возвращаются new Throwable().getStackTrace(), заключается в том, что метод Древесина # getTag предполагает, что 6-й элемент StackTraceElement является источником журнала ...
например: new Throwable().getStackTrace()[5] == MainFragment Class или new Throwable().getStackTrace()[5] == Logging Class
Примечание: new Throwable().getStackTrace() вызывается по адресу Древесина # getTag, а не там, где мы ведем журнал. Во время регистрации мы иногда даже не передаем Метательный (Timber.d("Fetching restaurants."))
спасибо @Holger. Я давно не занимался Java, чтобы понять его сложные внутренние детали, но у меня довольно обширные знания схожих языков, и я могу сказать, когда вижу, что что-то делается в обратном направлении ...
К сожалению, содержимое массива трассировки стека никогда не было точно указано, даже хуже того, в документации явно упоминается возможность того, что конкретная реализация может пропускать кадры стека по каким-либо техническим причинам. Потребовалось до Java 9, прежде чем был представлен стандартный способ программного исследования стека или просто получения непосредственного вызывающего объекта (API StackWalker). Этот API также позволяет указать, следует ли пропускать кадры отражения и т. д. Но я полагаю, это еще не вошло в Android API.
Это что-то ужасно ненадежное. Я видел и то, и другое, конструктор
Throwable()включенный и исключенный, в дикой природе. Однажды я увидел дажеThrowable.fillInStackTrace(), вызываемый конструктором, включенным в трассировку стека. Если вы хотите использовать этот способ для определения вызывающего, вы должны проверить фактические кадры стека в массиве, чтобы сначала идентифицировать себя, а затем предположить, что следующая запись будет вызывающей (хотя нет стандарта относительно того, как обрабатывать отражающие вызовы ).