Как установить точку останова в конструкторе Java по умолчанию в Eclipse?

В Eclipse я хотел бы установить точку останова на Java конструктор по умолчанию. Я не могу просто дважды щелкнуть слева от любой строки кода, поскольку конструкторы по умолчанию не имеют исходного кода — они неявно генерируются компилятором Java.

Я хотел бы иметь возможность установить такую ​​точку останова без изменения существующего кода.


person Greg Mattes    schedule 09.12.2009    source источник


Ответы (9)


Если код, в котором вы хотите установить точку останова, находится на пути сборки, а не в самом вашем проекте, то, если вы откроете представление Outline, вы увидите, что там присутствует конструктор по умолчанию. , и вы можете щелкнуть его правой кнопкой мыши и выбрать Переключить точку останова метода.

Обратите внимание, что иногда конструктор по умолчанию отфильтровывается из представления Outline. В этом случае его можно включить, изменив настройки фильтра. Для этого перейдите в меню просмотра СтруктураФильтры... → и снимите флажок Синтетические элементы.

Это в Eclipse Indigo, я не знаю, как долго существует эта функциональность.

person user655063    schedule 23.08.2011
comment
Этот конструктор по умолчанию отображается в представлении структуры только в том случае, если класс получен из внешнего файла JAR. Но представление схемы исходного файла Java в моей рабочей области не содержит конструктора по умолчанию (Eclipse Indigo SR2). Это по крайней мере разница, которую я нашел. - person rwitzel; 13.03.2013
comment
Работал как шарм! (выпуск Марс.2 (4.5.2)) - person bernie; 18.05.2016

Если вам это действительно нужно, установите точку останова метода в одном из других методов класса, выберите точку останова (представление точек останова) и экспортируйте ее. Отредактируйте этот файл, чтобы точка останова указывала на стандартный конструктор. По крайней мере, следующие атрибуты должны быть изменены (Galileo):

  • org.eclipse.jdt.debug.ui.JAVA_ELEMENT_HANDLE_ID
  • org.eclipse.jdt.debug.core.methodName — value="<init>"
  • org.eclipse.jdt.debug.core.methodSignature — value="()V"
  • сообщение - понятия не имею, действительно ли это необходимо

вероятно, проще также экспортировать точку останова конструктора из другого класса, чтобы увидеть правильные значения. Теперь импортируйте измененный файл, и у вас должна быть точка останова конструктора.

Это хак, но у меня сработало...

person user85421    schedule 09.12.2009

Решение 1: инициализаторы членов

Если у вас есть какие-либо переменные-члены с инициализаторами, вы можете поставить на них точку останова. Например:

class MyClass {
  private int i = 0; // this line can have a breakpoint in Eclipse
}

Решение 2: контрольные точки загрузки классов

Если вы можете обойтись только одним нажатием на эту точку останова, вы можете использовать точка останова загрузки класса:

Вы можете установить точку останова загрузки класса, которая остановится, когда класс загружается [так в оригинале]. Щелкните правой кнопкой мыши класс в обозревателе пакетов, обозревателе проектов или типах и выберите «Переключить точку останова загрузки класса».

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

person Matt Solnit    schedule 09.12.2009
comment
Да, хорошо, но это все еще как-то нелепо — конструктор по умолчанию существует, он работает, верно? :) Кажется разумным иметь возможность взломать его. Я понимаю, что его нет в исходниках, поэтому отладчик должен каким-то образом сигнализировать, что он находится в синтезированном коде без номера строки. - person Greg Mattes; 09.12.2009
comment
Вы также можете установить точку останова загрузки класса, просто дважды щелкнув рядом с public class TheClassName. Вместо маленького синего круга вы видите большой зеленый круг с буквой C внутри. - person MatrixFrog; 09.09.2011
comment
@MatrixFrog здесь, по какой-то причине была включена точка останова загрузки класса, и я не смог найти причину, спасибо! - person Aquarius Power; 11.05.2017

Я хотел бы немного улучшить ответ, данный rsp, немного упростив его, но пока не могу оставлять комментарии.

Если вы создаете конструктор по умолчанию (например, нажав ctrl+alt+s, а затем c), поместите точку останова в вызов этого конструктора, а затем нажмите ctrl+z, чтобы отменить создание конструктора по умолчанию, у вас все еще будет точка останова. без изменений в коде.

Надеюсь, поможет

person lopezvit    schedule 29.08.2014
comment
Имейте в виду, что спрашивающий прокомментировал этот ответ, сказав, что предпочитает этого не делать. Кроме того, этот вопрос продолжается пять лет. - person muffin; 29.08.2014
comment
Что ж, ему может быть и 5 лет, но разработчики Eclipse до сих пор не исправили этот недостаток. Мне нужно было то же, что и опу, и я пришел сюда искать решение. Попробовав данные ответы, я улучшу ответ другого пользователя и опубликую его здесь, чтобы помочь другим в такой же ситуации. Кроме того, я помнил, что оператор не хотел менять исходный код, и мое решение этого не делает: оно просто создает временный конструктор по умолчанию, который присутствует только для установки точки останова, а затем вы его отменяете. . В любой момент вы что-то изменяете, потому что не сохраняете это на диск. - person lopezvit; 31.08.2014
comment
Вы правы, это было ошибкой понимания прочитанного с моей стороны. Я оставлю свой первоначальный комментарий там, чтобы ваш был не лишен контекста, но считаю его отозванным по духу. - person muffin; 31.08.2014

вы можете сделать следующее:

public class MyClass {

    public MyClass() {
       super();
    }

}

А затем поставить точку останова на этом. Однако чего вы надеетесь добиться этим?

person Zack Marrapese    schedule 09.12.2009

Как насчет создания общедоступного конструктора без аргументов и установки на нем точки останова? Если это не поможет, не могли бы вы уточнить, почему нет?

person rsp    schedule 09.12.2009
comment
Я бы предпочел не трогать код. Это не было написано мной, и в нем есть некоторые вещи O/RM-структуры, которые я бы не стал рисковать беспокоить, если я могу этого избежать. - person Greg Mattes; 09.12.2009

Вы всегда можете создать свой собственный конструктор без аргументов и поставить там точку останова. Более того, зачем вам нужна точка останова? Он просто привязывается к super() без аргументов. Если у вас есть код, который вас интересует, поместите точку останова внутри этого конструктора.

person Hank Gay    schedule 09.12.2009
comment
Это будет ломаться для каждого созданного подкласса, возможно, не подходит. - person Grundlefleck; 10.12.2009

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

Я думал, что Eclipse предоставляет точку останова конструктора по умолчанию, но, увы, только точка останова, загруженная классом в схеме.

Какую проблему вам нужно решить на самом деле?

person Thorbjørn Ravn Andersen    schedule 09.12.2009

Вы можете использовать структуру YouDebug для создания сценария сеанса отладки, включая точка останова на любом конкретном методе любого класса.

Точки останова — это обработчики обратного вызова событий, которые вызываются, когда определенное событие происходит в целевой JVM. Вы можете создавать точки останова, вызывая методы точек останова для объекта 'vm'. Эти методы принимают замыкание, которое вызывается при возникновении события, и они часто принимают дополнительные аргументы для управления характером точки останова.

Следующий код определяет точку останова в строке 7 org.acme.SubStringTest.java (или любого исходного файла, в котором определен этот класс:)

vm.breakpoint("org.acme.SubStringTest",7) {
  println "I'm at SubStringTest.java line 7";
}
person VonC    schedule 09.12.2009