10

我目前面临以下问题:

我有一个特定的类,其中 equals() - 方法被覆盖。但是我不确定它是否曾经被使用过(在我或我的一个同事项目中)。有没有办法找出来?当我搜索引用时,它只是给了我对 Object equals() - 方法的所有引用(相当多)。肯定有比扫描所有这些更简单的方法......

有人有想法吗?

4

5 回答 5

7

您要求 Eclipse 解决一项不可能完成的任务。

要确定是否调用了特定的覆盖方法不是静态可判定的,这就是 Eclipse 过度近似响应的原因。

假设你有一些领域Object o并且你在某个时候做o.equals(...)。要确定是否o可以引用一个YourClass对象,您需要确定o每个可能的执行路径的运行时类型,这根本无法静态完成。

不可能的原因与编译器拒绝以下代码的原因非常相似:

Object o = "hello";
System.out.println(o.length());

您可以做的最好的事情可能是通过设置断点或通过从 equals 方法中抛出例如 UnsupportedOperationException 来调试您的程序。

于 2012-05-15T14:18:48.420 回答
3

似乎java在这方面被打破了。因此,您需要努力做到这一点,并希望抓住所有事件。

  • 创建班级的副本
  • 删除旧类
  • 通过一一重命名来修复所有编译器错误。
  • 查找类用作地图键的情况
  • 寻找类的集合( indexOf(), contains() )
  • 查找对类的 equals() 或 hashCode() 的调用
  • 希望你没有错过什么
于 2015-11-13T11:05:01.867 回答
2

我想不出一种纯粹通过静态分析可靠地做到这一点的方法(我怀疑是否存在)。

一种可能有用的实用方法是在方法的第一行设置断点equals(),然后在 Eclipse 调试器中启动程序。每当调用该方法时,Eclipse 都会中断调试器。此时,您将能够检查调用堆栈以查看谁调用了该方法。

要有效地做到这一点,您必须了解哪些代码路径可以调用该方法。如果您无法触发该方法,这并不能证明没有人使用它。

于 2012-05-15T14:18:17.250 回答
1

在 Eclipse -> Package explorer 或 Outline 视图中选择方法名称,然后单击 F4。或者,您可以选择方法 -> 右键单击​​ -> 打开调用层次结构
这将显示在您的工作区中调用此方法的所有成员。希望这可以帮助

于 2012-05-15T14:20:38.390 回答
1

如何修改覆盖的等于:

log.debug // Whatever you want
return this == obj;

哪个给你经典的 Object equals ?或者如果你扩展了某个类,也许是 super.equals?

于 2012-05-15T14:27:24.907 回答