__ СТРОКА __ эквивалентный в Java?

Сериализация является процессом превращения объекта в памяти в поток байтов, таким образом, можно сделать, материалу нравится, хранят его на диске или отправляют его по сети.

Десериализация является обратным процессом: превращение потока байтов в объект в памяти.

19
задан Community 23 May 2017 в 10:29
поделиться

6 ответов

Если вы компилируете с параметром debug = line , информация о строке существует в файле класса, но виртуальная машина может выбросить ее во время выполнения. Это зависит от некоторых параметров, которые вы можете указать при запуске программы Java. Обычно снижение производительности при работе с отладочной информацией составляет около 5% плюс немного больше памяти в пространстве perm gen. Поскольку эта информация бесценна, я не вижу причин удалять ее.

Ваш комментарий ( Util.java (встроенный скомпилированный код) ) предполагает, что вы используете агрессивные оптимизации. Если можете, выключите их. Таким образом, вы можете просто:

// 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 + на текущий номер строки. Это позволяет зафиксировать номер строки на месте.

8
ответ дан 30 November 2019 в 03:53
поделиться

Невозможно получить эффект __ LINE __ в C, который происходит во время компиляции.

Вы можете получить номер строки, вызвав такую ​​функцию во время выполнения,

public static int lineNumber() {
    return Thread.currentThread().getStackTrace()[2].getLineNumber();
}
13
ответ дан 30 November 2019 в 03:53
поделиться

Я бы использовал для этого фреймворк журналирования и позволил бы ему разбираться с беспорядочными деталями. И java.util.logging, и logback могут легко отображать информацию о вызывающем абоненте, аналогичную той, что может предоставить LINE .

Основное преимущество состоит в том, что информация вычисляется только в случае необходимости, поэтому отсутствие вывода означает отсутствие накладных расходов. .

1
ответ дан 30 November 2019 в 03:53
поделиться

Я не думаю, что Java предлагает то, что вам нужно.

Однако, если бы вам пришлось написать свой собственный процессор аннотаций и использовать API-интерфейсы компилятора Java 6.0 ] Думаю, вы могли бы решить эту проблему. Я бы не стал догадываться, сколько работы потребуется для этого.

Обратите внимание, что Eclipse позволяет вам включать вашу собственную обработку аннотаций в свой механизм сборки.

0
ответ дан 30 November 2019 в 03:53
поделиться

Я не знаю такого в Java-компиляторе. Но вы можете написать простую программу, которая заменяет токен типа __ LINE __ на номер файла в файле и настраивает процесс сборки для выполнения этого инструмента перед компиляцией. Какой-то препроцессор.

0
ответ дан 30 November 2019 в 03:53
поделиться

Верно, что из коробки эти макросы недоступны. Однако, используя инструменты и отладочную информацию, вы можете это реализовать. check http://www.gallot.be/?p=85

5
ответ дан 30 November 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: