弹簧复制属性如何工作?

时间:2015-05-19 13:17:25

标签: java spring

我们在代码中使用org.springframework.beans.BeanUtils (v2.5.x)来复制对象中的一些属性。

作为一个临时的东西,我在setter中设置了一个println并设置了一个调试点,但是我发现复制属性从未使用过setter。此外,我在正在设置的变量上设置了一个断点,它仍然会跳过它。

这是怎么回事?如何在修改变量时中断?

3 个答案:

答案 0 :(得分:1)

我相信Spring使用反射来实现这一点,你甚至可以通过反射API读取私有字段。

编辑:这意味着你在使用copyProperties时永远不会调用你的getter和setter。

答案 1 :(得分:1)

第二个选项,在下面的步骤#5中,声明如果表达式的值发生变化,您可以告诉Eclipse在该行中断。

  

Eclipse: Managing conditional breakpoints

     

条件表达式可以应用于行断点,以便断点在以下某种情况下暂停执行线程:

     
      
  • 当表达式的结果为真时
  •   
  • 当表达式的结果发生变化时
  •   
     

条件表达式可以包含任意Java代码,并且可以包含多个语句,允许断点条件实现跟踪等功能。例如,条件可以执行print语句,然后返回硬编码值以永不挂起(" System.out.println(...); return false;")。

在Eclipse中设置条件断点:

  

在断点上设置条件:

     
      
  1. 找到要应用启用条件的断点(在Breakpoints View或编辑器标记栏中)。
  2.   
  3. 从断点的弹出菜单中,选择Breakpoint Properties ....将打开断点属性对话框。
  4.   
  5. 在属性对话框中,选中Enable Condition复选框。
  6.   
  7. Condition字段中输入断点条件的表达式。
  8.   
  9. 执行以下操作之一:   
        
    • 如果您希望断点在每次条件评估为 true 时停止,请选择条件为' true' 选项。提供的表达式必须是布尔表达式。
    •   
    • 如果您希望断点仅在条件结果发生变化时停止,请选择条件更改值选项。
    •   
  10.   
  11. 选择确定以关闭对话框并提交更改。启用断点时,如果断点条件的计算结果为 true ,则在执行该行代码之前,线程执行将暂停。
  12.         

    条件断点在断点图标上有一个问号覆盖。

答案 2 :(得分:0)

大多数Java调试器都有一个“监视”功能,可以在对象发生变化时中断。

如果你使用依赖管理器(Gradle或Maven)来获取源代码,你可以浏览源代码并查看BeanUtils实际在做什么(可能使用Fields)。