很酷的对象调试

时间:2009-10-09 09:49:11

标签: java eclipse netbeans

我只是想知道我是否有可能在java中。假设在使用eclipse或netbeans进行调试时,您可以记录一个对象并保存它。然后在进行第二轮调试时,再次保存对象。现在,您可以将记录的第一个对象与所有属性的第二个对象进行比较,并找出任何差异。这可能吗?

3 个答案:

答案 0 :(得分:5)

您可以在纯Java代码中执行此操作(假设您的对象为Serializable),但我认为任何调试器都不会内置此功能。

这只是在调试运行期间序列化第一个对象的情况(如果您有一个静态方法,通常可以从调试器调用)并将其保存在某处。然后,在第二次运行期间,调用另一个方法从它的序列化形式重构对象 - 然后比较对象(使用他们的equals()方法,或者更一些定制的比较方法)。

在实践中虽然我发现每当我想要这样做时,我只是在一张纸上写下相关属性并手动比较它们。我很少看到成千上万的物业可能会在一次奔跑之间发生变化;如果你考虑一下你所看到的症状以及你的对象的行为,你通常可以很好地了解在你启动调试器之前可能会发生什么变化,然后使用后者来确认你的假设并回溯到看看价值“出错”的地方。

答案 1 :(得分:1)

为对象提供有用的toString()方法,然后使用单元测试将结果与预期结果进行比较。

但我同意:远程调试的有线协议可以序列化任何对象,因此应该可以编写一个自动执行此操作的程序。

OTOH,不打算序列化的对象可能很危险。如果您不小心在类加载器上使用它,您将获得所有对象和类以及所有内容作为一个大块。因此,您需要一种方法来停止序列化,以确保它不会在深层对象树中运行。

最重要的是,我想要一个功能来保存应用程序的当前状态,并能够及时返回。

答案 2 :(得分:1)

我认为任何调试器都不能保存对象以便稍后进行比较。你可以做的是在变量上创建一个监视变量,但用apache commons的ToStringBuilder()包装它并将其转储到控制台中,如下所示:

System.out.println(ToStringBuilder.reflectionToString(object));

每次到达断点时,对象的内容都将显示在控制台中。你甚至可以看到私人数据。

因此,您不需要直接修改对象的toString()方法(例如,这对库对象很有用)。然后,您可以比较两次传球的输出。