【问题标题】:How to set a breakpoint in a setter method in IntelliJ IDEA that is generated with Lombok?如何在使用 Lombok 生成的 IntelliJ IDEA 中的 setter 方法中设置断点?
【发布时间】:2014-09-05 06:40:10
【问题描述】:

IntelliJ IDEA 中有没有办法在 Lombok 生成的 setter 方法中设置断点

这在某些调试场景中非常有用,例如查看何时从 Hibernate 等框架调用 setter。

实际上,生成的setter方法显示在IntelliJ IDEA的结构视图中(使用中的Lombok插件)。但是我还没有找到通过上下文菜单等设置断点的方法。

【问题讨论】:

    标签: java hibernate intellij-idea lombok


    【解决方案1】:

    作为一种解决方法,您可以使用 Java Field Watchpoint。在这种情况下,该字段的每次访问/修改都将导致一个断点。

    这种方法的缺点是当您直接访问/修改字段或使用 getter/setter 方法时都会导致线程暂停。

    但是,当您使用 setter 方法捕获断点时,IDEA 还会在“变量”窗口中显示一个参数(与用于观察点的字段同名),并且断点不会显示在字段的行中,而是显示在类的行。

    以下简短描述,如何创建现场观察点,复制自https://www.jetbrains.com/idea/help/creating-field-watchpoints.html

    1. 在主菜单上,选择运行 |查看断点,或按 Ctrl+Shift+F8。
    2. 在打开的断点对话框中,单击添加(加号图标)按钮。
    3. 从下拉列表中选择 Field Watchpoint:“Java Field Watchpoints”
    4. 在打开的“添加字段观察点”对话框中,指定以下内容:
      包含所需字段的类的完全限定名称。您可以手动键入,或单击浏览按钮,并按名称或从项目中找到所需的类。
      字段名称。您可以手动输入,也可以点击浏览按钮,从所选类的字段列表中选择所需字段。
    5. 此外,您可以设置其他选项,例如字段访问(对于 getter)或字段修改(对于 setter)

    【讨论】:

      【解决方案2】:

      据我了解,您不能这样做,因为 lombok 正在以一种变异代码没有自动生成部分的行号的方式改变您的字节码。

      这样做是为了让您的源代码行始终与您的字节码匹配。如果它们不匹配,当您将断点放在一行上但执行没有停止或在其他地方停止(因为行号不匹配)时,您可能会陷入这种情况。

      但作为交换 Lombok 失去了调试生成代码的能力(你不能在没有行号的行上放置断点)。您必须相信生成的代码是正确的这一事实。

      【讨论】:

      • 谢谢。这似乎是一个合理的解释。关于 Lombok 生成的调试代码:我不怀疑这段代码是正确的。但是,如果我能够在调用 Lombok getter 时停止调试器,这将使调用代码的调试变得更容易——尤其是当这些类是从 Hibernate 等框架调用时。
      • 您可以使用 delombok 生成类似于 lombok 在后台使用的代码的 java 代码,并在生成的代码中设置断点。
      【解决方案3】:

      断点作用于隐式函数。 delombok 功能允许生成隐式实现(调试后您可以/应该恢复首次更改)。要进行隐式实现,只需右键单击类名并选择以下菜单行:

      【讨论】:

      • 这可能是理想的解决方案。虽然您可以使用现场观察点,但它们的速度非常慢,而且如果您无法访问源代码,这不是问题。
      【解决方案4】:

      在结构视图中选择设置器并右键单击。弹出菜单包含一个菜单项“Toggle Method Breakpoint”(就像你可以在类的默认构造函数中设置断点一样,而在它的 java 代码中没有默认构造函数)

      【讨论】:

      • 感谢您的回答。不幸的是,这不适用于 Lombok 生成的方法 - 至少对我而言。虽然 IDEA 的断点对话框中列出了普通“手写”Java 方法的方法断点,但对于 Lombok 生成的断点,情况并非如此。
      【解决方案5】:

      我赢了:

      • 运行 -> 查看断点(或 Ctrl+Shift+F8)
      • 点击“+”(或 Alt+Ins)
      • 选择'1。 Java 方法断点'
      • 要么痛苦地输入完全限定的类名,要么输入诸如“*.MyClass”之类的模式
      • 输入方法名称
      • 点击确定

      只花了我 6 年 :-)

      在 Eclipse 上:右键单击类大纲或类型层次结构中的方法,然后选择“切换方法断点”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-20
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        • 2013-07-17
        • 1970-01-01
        相关资源
        最近更新 更多