我们在代码中使用org.springframework.beans.BeanUtils
(v2.5.x)来复制对象中的一些属性。
作为一个临时的东西,我在setter中设置了一个println
并设置了一个调试点,但是我发现复制属性从未使用过setter。此外,我在正在设置的变量上设置了一个断点,它仍然会跳过它。
这是怎么回事?如何在修改变量时中断?
答案 0 :(得分:1)
我相信Spring使用反射来实现这一点,你甚至可以通过反射API读取私有字段。
编辑:这意味着你在使用copyProperties时永远不会调用你的getter和setter。
答案 1 :(得分:1)
第二个选项,在下面的步骤#5中,声明如果表达式的值发生变化,您可以告诉Eclipse在该行中断。
Eclipse: Managing conditional breakpoints
条件表达式可以应用于行断点,以便断点在以下某种情况下暂停执行线程:
- 当表达式的结果为真时
- 当表达式的结果发生变化时
条件表达式可以包含任意Java代码,并且可以包含多个语句,允许断点条件实现跟踪等功能。例如,条件可以执行print语句,然后返回硬编码值以永不挂起("
System.out.println(...); return false;
")。
在Eclipse中设置条件断点:
在断点上设置条件:
- 找到要应用启用条件的断点(在Breakpoints View或编辑器标记栏中)。
- 从断点的弹出菜单中,选择Breakpoint Properties ....将打开断点属性对话框。
- 在属性对话框中,选中Enable Condition复选框。
- 在Condition字段中输入断点条件的表达式。
- 执行以下操作之一:
- 如果您希望断点在每次条件评估为 true 时停止,请选择条件为' true' 选项。提供的表达式必须是布尔表达式。
- 如果您希望断点仅在条件结果发生变化时停止,请选择条件更改值选项。
- 选择确定以关闭对话框并提交更改。启用断点时,如果断点条件的计算结果为 true ,则在执行该行代码之前,线程执行将暂停。
醇>条件断点在断点图标上有一个问号覆盖。
答案 2 :(得分:0)
大多数Java调试器都有一个“监视”功能,可以在对象发生变化时中断。
如果你使用依赖管理器(Gradle或Maven)来获取源代码,你可以浏览源代码并查看BeanUtils实际在做什么(可能使用Fields)。