Если вы скомпилируете с опцией debug=line
, информация о строке существует в файле класса, но виртуальная машина может выбросить ее во время выполнения. Это зависит от некоторых параметров, которые вы можете указать при запуске Java-программы. Обычно снижение производительности при работе с отладочной информацией составляет около 5% плюс немного больше памяти в пространстве perm gen. Поскольку эта информация настолько неоценима, я не вижу причин для ее удаления.
Ваш комментарий (Util.java(Inlined Compiled Code)
) предполагает, что вы используете агрессивную оптимизацию. Если можешь, выключи их. Таким образом, вы можете просто:
// For Java 1.4, use new Exception().getStackTrace()
int line = Thread.currentThread().getStackTrace()[0].getLineNumber();
когда вам это нужно (т.е. внутри catch
или if (log.isInfoEnabled())
).
Что касается __LINE__
, компилятор Java не поддерживает это. Ваш единственный вариант - использовать некоторые хаки для фильтрации источника. Я предлагаю определить переменную int __LINE__
где-нибудь и установить ее на случайное значение (0 достаточно случайное), когда вам это нужно. Затем напишите фильтр, который заменяет число в __LINE__ = \d+
на текущий номер строки. Это позволяет зафиксировать номер строки на месте.