Работаем со 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 — имя метода. Надеюсь сделанное мною «открытие» будет полезно.

Реклама

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

  1. Yevhen says:

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

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

  2. Oleg says:

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

  3. katran1990 says:

    Спасибо огроменное! Лаконично. У меня примерно такая же задача. Увидел как сделать лучше.

  4. Андрей says:

    Спасибо! Это необходимая информация!

  5. Андрей says:

    Спасибо!Отличная статья!

  6. Никита says:

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

  7. maxim says:

    Конструкция в принципе понятная. Спасибо. Мне кажется она немного сложнавата для такого простого действия как узнать как метод вызвал текущий. Неужели нет решения из коробки? Сама джава этого не делает?

  8. Ян says:

    Весьма благодарен!

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

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

Логотип WordPress.com

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

Google+ photo

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

Фотография Twitter

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

Фотография Facebook

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

w

Connecting to %s

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