2016-07-15 4 views
0

Я поклонник журналов отладки (в отладочных сборках), и я хочу внести некоторые улучшения в свой собственный класс регистратора. В идеале я хотел бы создать базовый метод, который регистрирует имя вызывающего класса, имя метода и значения параметров.Автоматическая регистрация в Android

Например, у меня есть приложение «MyApplication» с классом «MainActivity», и я вызываю метод «foo» с параметром «bar». Я хотел бы увидеть что-то подобное в LogCat:

D/MyApplication MainActivity foo("bar")

Есть ли способ получить эту информацию без необходимости проходить во всех этих значениях вручную? Я видел некоторые статьи, ссылающиеся на поддерживаемые Java методы, такие как java.lang.invoke.MethodHandles, но я не нашел ссылок на поддерживаемые Android методы. Я ожидаю, что параметры будут переданы, но автоматизация имени класса и имени метода будет отличной.

ответ

2

Вызов Thread.currentThread().getStackTrace() может предоставить вам StackTraceElement текущей темы. Затем вы можете позвонить getClassName(), getMethodName() и getLineNumber(), чтобы распечатать класс, метод и строку кода. Это выглядело бы так, как в коде.

StackTraceElement ste = Thread.currentThread().getStackTrace()[0]; 
String msg = ste.getClassName() + "." + ste.getMethodName() + ":" + ste.getLineNumber(); 
+0

Спасибо @ChrisStillwell, я видел ответы, подобные этому, и должен был включить его в мой вопрос. Мой вопрос к этому - вот что представляет собой [3]? Я видел ответы с [0] и [1], но я не знаю, какой элемент отслеживания стека является надежным. – lgdroid57

+0

'[3]' был потому, что я скопировал это из библиотеки, которую я могу использовать в своих проектах. В принципе 'getStackTrace()' возвращает массив 'StackTraceElement'. Верхняя часть массива - это верхняя часть stacktrace (то есть, где это вызвано). Если вы хотите, чтобы полная петля цикла через массив обеспечила вам полную иерархию вызовов. Точно так же, как и стек, который вы получаете, когда генерируется исключение. – ChrisStillwell

+0

В принципе, если я выдаю исключение в строке 15 в 'SomeMethod()' stacktrace, я вижу, что он будет идентичен тому, который я могу распечатать, если бы я должен был вызвать 'Thread.currentThread(). GetStackTrace()' в строке 15 в 'SomeMethod()'. – ChrisStillwell

Смежные вопросы