Бывают ситуации, когда кроме какого-либо сообщения хочется залогировать имя класса, имя метода или даже номер строки, на которой в данной момент происходит выполнение кода. Если с именем класса все более-менее понятно – достаточно в функцию логирования передать ссылку на класс – то с именем метода такой фокус не пройдет. Но и эта проблема решается достаточно просто.
Для этого необходимо создать инстанс класса Throwable и получить из него текущий стэк вызовов. Найти нужный нам элемент стэка и получить оттуда всю необходимую информацию: объект класса, имя класса, имя метода и, даже, номер строки.
Ниже представлен кусок кода, где показато как это может быть реализовано.
public class Test { public static void main(String[] args) { new Test().execute(); } public void execute() { log("Some message"); } public static void log(String message) { Throwable t = new Throwable(); StackTraceElement trace[] = t.getStackTrace(); // Глубина стэка должна быть больше 1-го, поскольку интересующий // нас элемент стэка находится под индексом 1 массива элементов // Элемент с индексом 0 - это текущий метод, т.е. log if (trace.length > 1) { StackTraceElement element = trace[1]; System.out.format("[%s] [%s, %d] %s", element.getClassName(), element.getMethodName(), element.getLineNumber(), message); } else System.out.format("[no info] %s", message); } }