Java 如何在使用Lombok生成的IntelliJ IDEA中的setter方法中设置断点?

Java 如何在使用Lombok生成的IntelliJ IDEA中的setter方法中设置断点?,java,hibernate,intellij-idea,lombok,Java,Hibernate,Intellij Idea,Lombok,IntelliJ IDEA中是否有办法在由Lombok生成的setter方法中设置一个断点 这在某些调试场景中非常有用,例如查看setter何时从Hibernate之类的框架调用 事实上,生成的setter方法显示在IntelliJ IDEA(正在使用的Lombok插件)的结构视图中。但是我还没有找到通过上下文菜单等设置断点的方法。在结构视图中选择setter并右键单击。弹出菜单包含一个菜单项“Toggle Method Breakpoint”(与您可以在java代码中没有默认构造函数的类中的默

IntelliJ IDEA中是否有办法在由Lombok生成的setter方法中设置一个断点

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


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

在结构视图中选择setter并右键单击。弹出菜单包含一个菜单项“Toggle Method Breakpoint”(与您可以在java代码中没有默认构造函数的类中的默认构造函数中设置断点的方式相同)

据我所知,您不能这样做,因为lombok正在以一种方式对您的字节码进行变异,变异后的代码没有自动生成部件的行号

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


但在exchange中,Lombok失去了调试生成代码的能力(您不能在没有行号的行上放置断点)。您必须依赖生成的代码是正确的这一事实。

作为一种解决方法,您可以使用Java字段监视点。在这种情况下,每次访问/修改字段都会导致断点

这种方法的缺点是在直接访问/修改字段或使用getter/setter方法时都会导致线程挂起

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

以下简短说明(如何创建现场观察点)是从中复制的:

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

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

    我赢了:

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


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

    谢谢您的回答。不幸的是,这对Lombok生成的方法不起作用——至少对我来说是这样。虽然IDEA的断点对话框中列出了普通“手写”Java方法的方法断点,但Lombok生成的方法断点却不是这样。谢谢。这似乎是一个合理的解释。关于调试Lombok生成的代码:我毫不怀疑这段代码是正确的。但是,如果我能够在调用Lombok getter时在调试器中停止,这将使调用代码的调试更容易-尤其是当这些类是从Hibernate之类的框架中调用时。您可以使用delombok生成类似Lombok在后台使用的代码的java代码,并在生成的代码中设置断点。这可能是理想的解决方案。虽然您可以使用字段监视点,但它们的速度非常慢,如果您无法访问源代码,这是一个不存在的问题。