【问题标题】:Is there a way to list all calls of equals() of a certain class using Eclipse?有没有办法使用 Eclipse 列出某个类的所有 equals() 调用?
【发布时间】:2012-05-23 01:55:57
【问题描述】:

我现在遇到以下问题:

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

有人有想法吗?

【问题讨论】:

    标签: java eclipse class equals


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 我认为问题是关于工作区项目中的引用,而不是运行时调用
    • 我也是这样解释这个问题的。
    • 啊,我明白了;但是如果我在一个类中hilite一个覆盖的equals()调用并按F3,eclipse会正确地进入覆盖方法定义,而不是Objects equals()。那么为什么不能在工作区中的每个文件上重复呢?
    • 您缺少的是对参考的搜索只找到静态可知的参考。换句话说,编译器知道您有MyClass 的实例并且具有该引用的代码显式调用equals() 的情况。然而,由于equals() 是在Object 上定义的,它可以在任何Object 变量上调用,该变量可能已分配或未分配MyClass 的实例。例如,像集合之类的东西在其内容上调用equals(),但不知道内容的类是什么。
    • @guido,在原始问题的上下文中,“不可能”的答案绝对不会过分。问题已经表明,简单的参考文献搜索不会产生提问者想要的东西,他说“肯定有比扫描所有这些更简单的方法......” - 答案是,“不,没有。 "
    【解决方案2】:

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

    • 创建您的课程副本
    • 删除旧类
    • 通过一一重命名来修复所有编译器错误。
    • 查找将类用作地图键的情况
    • 寻找类的集合(indexOf(), contains())
    • 查找对类的 equals() 或 hashCode() 的调用
    • 希望你没有错过什么

    【讨论】:

      【解决方案3】:

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

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

      要有效地执行此操作,您必须了解哪些代码路径可以调用该方法。如果你无法触发该方法,这并不能证明没有人使用它。

      【讨论】:

      • 然后呢?在调试模式下执行所有可能的代码路径
      • @Asaph:恕我直言,非常欢迎您提出更好的建议。
      • 我本来打算去的,但我认为@aioobe 有答案(这是无法完成的)。我赞成他的回答。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        如何修改覆盖的等于:

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

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

        【讨论】:

          猜你喜欢
          • 2020-03-28
          • 2021-07-12
          • 2014-03-28
          • 2020-08-02
          • 2023-02-02
          • 1970-01-01
          • 1970-01-01
          • 2013-10-12
          • 1970-01-01
          相关资源
          最近更新 更多