10

現在、次の問題に直面しています。

equals() - メソッドがオーバーライドされている特定のクラスがあります。ただし、それが使用されているかどうかはわかりません(私のプロジェクトまたは同僚のプロジェクトのいずれかで)。調べる方法はありますか?参照を検索すると、オブジェクト 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は壊れているようです。そのため、難しい方法で実行し、すべての発生をキャッチする必要があります。

  • クラスのコピーを作成する
  • 古いクラスを削除する
  • 1 つずつ名前を変更して、すべてのコンパイラ エラーを修正します。
  • クラスがマップのキーとして使用されている箇所を探します
  • クラスのコレクションを探します ( 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

オーバーライドされた equals を次のように変更するのはどうですか:

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

古典的な Object equals はどれですか? それとも、クラスを拡張する場合は super.equals でしょうか?

于 2012-05-15T14:27:24.907 に答える