【发布时间】:2012-05-23 01:55:57
【问题描述】:
我现在遇到以下问题:
我有一个类,其中 equals() - 方法被覆盖。但是我不确定它是否曾经被使用过(在我或我的一个同事项目中)。有没有办法找出来? 当我搜索引用时,它只是给了我对 Object equals() - 方法的所有引用(相当多)。肯定有比扫描所有这些更简单的方法...
有人有想法吗?
【问题讨论】:
我现在遇到以下问题:
我有一个类,其中 equals() - 方法被覆盖。但是我不确定它是否曾经被使用过(在我或我的一个同事项目中)。有没有办法找出来? 当我搜索引用时,它只是给了我对 Object equals() - 方法的所有引用(相当多)。肯定有比扫描所有这些更简单的方法...
有人有想法吗?
【问题讨论】:
您要求 Eclipse 解决一项不可能完成的任务。
要确定是否调用了特定的重写方法不是静态可确定的,这就是 Eclipse 过度近似响应的原因。
假设你有一些字段Object o,并且你在某个时候做o.equals(...)。要确定o 是否可以引用YourClass 对象,您需要沿着每个可能的执行路径确定o 的运行时类型,这根本无法静态完成。
不可能的原因与编译器拒绝以下代码的原因非常相似:
Object o = "hello";
System.out.println(o.length());
您能做的最好的事情可能是调试您的程序,方法是设置断点或从 equals 方法中抛出例如 UnsupportedOperationException。
【讨论】:
MyClass 的实例并且具有该引用的代码显式调用equals() 的情况。然而,由于equals() 是在Object 上定义的,它可以在任何Object 变量上调用,该变量可能已分配或未分配MyClass 的实例。例如,像集合之类的东西在其内容上调用equals(),但不知道内容的类是什么。
似乎java在这方面被打破了。因此,您需要努力做到这一点,并希望能够捕捉到所有事件。
【讨论】:
我想不出一种纯粹通过静态分析可靠地做到这一点的方法(我怀疑是否存在)。
可能有帮助的一个实用方法是在equals() 方法的第一行设置断点,然后在Eclipse 调试器中启动程序。每当调用该方法时,Eclipse 都会中断调试器。此时,您将能够检查调用堆栈以查看谁调用了该方法。
要有效地执行此操作,您必须了解哪些代码路径可以调用该方法。如果你无法触发该方法,这并不能证明没有人使用它。
【讨论】:
在 Eclipse -> 包资源管理器或大纲视图中选择方法名称,然后单击 F4。
或者,您可以选择方法 -> 右键单击 -> 打开调用层次结构
这将显示在您的工作区中调用此方法的所有成员。
希望这会有所帮助
【讨论】:
如何修改覆盖的等于:
log.debug // Whatever you want
return this == obj;
哪个给你经典的 Object equals ?或者如果你扩展了某个类,也许是 super.equals?
【讨论】: