Работаем со StackTrace или как узнать, кто вызвал код

Совсем недавно решил усовершенствовать свой логер, про который уже писал ранее. Возникла необходимость внутри метода логера узнать, какой класс и метод делают вызов. Выход нашелся очень быстро, и не пришлось писать кучу ненужного кода — Java для такого случая имеет встроенный механизм, который позволяет отследить весь стек вызовов. Давайте посмотрим, как это сделать. А делается это очень просто при помощи вот такой конструкции Thread.currentThread().getStackTrace(). Любой код в Java выполняется обязательно в каком-то потоке. При помощи Thread.currentThread() получаем ссылку на текущий поток. Затем при помощи getStackTrace() получаем весь стек вызовов или stack trace (если честно, не знаю, как правильнее всего сказать про него по-русски). В результате получаем мы массив StackTraceElement[]. Каждый StackTraceElement содержит информацию так нужную нам. Первое — это имя класса, из которого делался или делается вызов. Второе — это имя метода, из которого делается вызов. К примеру в своем логере использовал вот такой код:

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
String message = "";
if(stackTraceElements.length >= 3) {
	StackTraceElement element = stackTraceElements[2];
	String className = element.getClassName();
	String methodName = element.getMethodName();
	message = className + ": " + methodName;
}

При помощи метода getClassName получил полное имя класса, а при помощи getMethodName — имя метода. Надеюсь сделанное мною «открытие» будет полезно.

3 Responses to Работаем со StackTrace или как узнать, кто вызвал код

  1. Yevhen:

    Хочу добавить: если массив не нулевой длины, то StackTraceElement с индексом 0 — это вершина стека, как сказано в http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#getStackTrace() .

    Автору спасибо за полезную (и при этом — короткую и понятную) статью!

  2. Oleg:

    Спасибо. Очень помогло!

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: