Как установить точку останова в методе установки в IntelliJ IDEA, созданном с помощью Lombok?

Есть ли способ в IntelliJ IDEA установить точку останова в методе установки, созданном Lombok?

Это было бы очень полезно в некоторых сценариях отладки, например. чтобы увидеть, когда сеттер вызывается из такой структуры, как Hibernate.

Фактически сгенерированные методы установки отображаются в представлении структуры IntelliJ IDEA (используется подключаемый модуль Lombok). Но я не нашел способа установить точку останова через контекстное меню или что-то подобное.


person rmoestl    schedule 15.07.2014    source источник


Ответы (5)


Насколько я понимаю, вы не можете этого сделать, потому что ломбок мутирует ваш байт-код таким образом, что мутированный код не имеет номеров строк для автоматически сгенерированных частей.

Это сделано специально, чтобы ваши строки исходного кода всегда соответствовали вашему байт-коду. Если они не совпадают, вы можете попасть в ситуацию, когда вы ставите точки останова на строку, но выполнение не останавливается или останавливается где-то еще (из-за несовпадения номеров строк).

Но взамен Lombok теряет возможность отлаживать сгенерированный код (вы не можете поставить точку останова на строку без номера строки). Вы должны полагаться на факт, что сгенерированный код правильный.

person SimY4    schedule 15.07.2014
comment
Спасибо. Это кажется разумным объяснением. Что касается кода отладки, сгенерированного Lombok: я не сомневаюсь, что этот код правильный. Однако, если бы я мог останавливаться в отладчике при вызове геттера Lombok, это упростило бы отладку вызывающего кода, особенно когда эти классы вызываются из таких фреймворков, как Hibernate. - person rmoestl; 16.07.2014
comment
Вы можете использовать delombok для создания кода Java, который напоминает код, который lombok использует под капотом, и устанавливать точки останова в сгенерированном коде. - person Roel Spilker; 16.07.2014

В качестве обходного пути вы можете использовать Java Field Watchpoint. В таком случае каждый доступ/изменение поля приведет к точке останова.

Недостатком этого подхода является приостановка потока как при доступе/изменении поля напрямую, так и при использовании методов получения/установки.

Однако, когда вы ловите точку останова с помощью методов установки, IDEA также показывает параметр (с тем же именем, что и поле, используемое для точки наблюдения) в окне переменных, и точка останова отображается не в строке поля, а в строке класса. .

Точка останова сеттера

Следующее краткое описание создания полевой точки наблюдения было скопировано с сайта https://www.jetbrains.com/idea/help/creating-field-watchpoints.html:

  1. В главном меню выберите «Выполнить | Просмотрите точки останова или нажмите Ctrl+Shift+F8.
  2. В открывшемся диалоговом окне «Точки останова» нажмите кнопку «Добавить» (значок «плюс»).
  3. Выберите Field Watchpoint из выпадающего списка: «Java Field Watchpoints»
  4. В открывшемся диалоговом окне "Добавить точку наблюдения за полем" укажите следующее:
    Полное имя класса, содержащего нужное поле. Вы можете ввести его вручную или нажать кнопку обзора и найти нужный класс по имени или в проекте.
    Имя поля. Вы можете ввести его вручную или нажать кнопку обзора и выбрать нужное поле из списка полей в выбранном классе.
  5. Кроме того, вы можете установить другие параметры, такие как доступ к полю (для геттеров) или модификация поля (для сеттеров).
person Фима Гирин    schedule 23.01.2016

Точки останова работают с неявными функциями. Функция delombok позволяет генерировать неявную реализацию (после отладки вы можете/должны отменить первые изменения). Чтобы сделать неявную реализацию, просто щелкните правой кнопкой мыши имя класса и выберите следующую строку меню:

введите описание изображения здесь

person Oleg Svechkarenko    schedule 28.12.2017
comment
Это, пожалуй, идеальное решение. Хотя вы можете использовать полевые точки наблюдения, они невероятно медленные, и если у вас нет доступа к исходному коду, это не проблема. - person Christopher Schneider; 20.02.2020

В представлении структуры выберите сеттер и щелкните правой кнопкой мыши. Всплывающее меню содержит пункт меню «Переключить точку останова метода» (так же, как вы можете установить точку останова в конструкторе по умолчанию в классе без конструктора по умолчанию в его java-коде)

person Dieter Rehbein    schedule 15.07.2014
comment
Спасибо за ответ. К сожалению, это не работает для методов, сгенерированных Lombok, по крайней мере, для меня. Хотя точки останова для обычных рукописных методов Java перечислены в диалоговом окне точек останова IDEA, это не относится к методам, сгенерированным Lombok. - person rmoestl; 15.07.2014

Я выигрываю:

  • Выполнить -> Просмотр точек останова (или Ctrl+Shift+F8)
  • Нажмите «+» (или Alt+Ins)
  • Выберите «1. Точка останова метода Java'
  • Либо мучительно введите полное имя класса, либо шаблон, такой как «*.MyClass».
  • Введите название метода
  • Нажмите ОК

Мне понадобилось всего 6 лет :-)

В Eclipse: щелкните правой кнопкой мыши метод в структуре класса или иерархии типов и выберите «Переключить точку останова метода».

person Reg Whitton    schedule 16.11.2020