Java Reflection Equals Question
-
08-07-2019 - |
質問
これは、誰かがこれを手伝ってくれる日だった。
2つのストックオブジェクトがあり、実行時にプロパティを比較します。 1つのインスタンスはキャッシュされたインスタンスであり、もう1つのインスタンスはシステムに配信されたばかりの新しいストックインスタンスです。以下を参照してください。ここで、mはStockクラスのメソッドであり、stockはStockのインスタンスです
try {
// I want to compare these two objects, return type of m may vary
Object result = m.invoke(stock);
Object cacheResult = m.invoke(stockCache.get(ticker));
// The return type of m may vary but is known at runtime
Class returnType = m.getReturnType();
// I assume I need to cast before .equals() will work correctly
if(result.equals(cacheResult)) {
// Will this work or do I need to cast
}
}catch (Exception ex) {
}
編集:リフレクションを使用している理由について尋ねた人のために、私はリバースajaxフレームワークDWRを使用しており、html idプロパティをオブジェクトプロパティにマップしようとしています。 id値。オブジェクトをUIにプッシュすると、このメソッドにより、オブジェクト全体ではなく、変更されたプロパティのみをプッシュできます。
解決
キャストする必要はありません。 Javaは自動的に正しい equals
メソッドを選択します。その行をデバッグして、各オブジェクトが Class
であるかどうかを確認することをお勧めします。
他のヒント
いいえ、キャストする必要はありません。 通常、equalsメソッドは次のようになります
@Override
public boolean equals(Object o){
if (! o instance of ThisClass){
return false;
}
//other equality tests based on members
}
キャッシュがクラスオブジェクトを1つだけ保持している場合(つまり、派生クラスをキャッシュしていない場合)、動作するはずです。 StockCacheにオブジェクトを保存しているようです。たぶんそれは少し一般的すぎるかもしれませんし、いくつかの基本クラス(たぶんStockClass)に絞り込むのがより良い選択肢でしょう。次に、ゲッターは、キャッシュクラスで定義されます:
StockObject getStockObject(KeyType key);
これに加えて、リフレクションはやり過ぎのように思えます(比較したいオブジェクトがある場合、リフレクションを使用する理由は?)
ここでのキャストは効果がありません。結果は、equals()メソッドがStockクラスでどのように実装されるかに完全に依存します。
しかし、どうしてこのためにリフレクションを使用しているのですか?おそらく正しいことではないでしょう。
これを見てください: