2009-05-07 7 views
1

これは当時の人の一人でした。Java Reflectionは質問と同じです

私は実行時にプロパティを比較したい2つのストックオブジェクトを持っています。 1つのインスタンスがキャッシュされたインスタンスであり、もう1つはシステムに配信された新しいストックインスタンスです。これはキャッシュされたインスタンスと等しいかもしれません。 mはクラスストックからのメソッドである場合についてを参照してくださいと株価は

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) { 
} 

EDIT株のインスタンスである:私はリフレクションを使用しています理由について尋ねてきた人のために、私は逆のAjaxフレームワークのDWRを使用していると私は思いますhtml idプロパティをオブジェクトプロパティにマッピングしようとしました。これにより、関連するHTML ID値でプロパティに注釈を付けることができます。このメソッドは、オブジェクトをUIにプッシュすると、オブジェクト全体ではなく変更されたプロパティだけをプッシュすることができます。

+1

あなたは私たちメートルの期待リターンの種類についていくつかのより多くの情報を提供してもらえますか?文字列や整数のようなスカラー値か、より複雑なオブジェクトですか?それらは共通のスーパークラスを持つオブジェクトですか? –

+0

キャストする必要はありません。そしてtry/catch(Exception)も必要ありません。 equalsメソッドが想定どおりに動作することを確認するだけです。 – OscarRyz

答えて

7

キャストする必要はありません。 Javaは自動的に正しいequalsメソッドを選択します。その行をデバッグして、それぞれのオブジェクトが何であるかを確認することをお勧めします。

+2

「キャストする必要はありません」ではなく、キャストする必要はありません。 Javaは実行時に正しいequals(Object)メソッドを決定して呼び出します。 –

+0

@ Steve:カールがあまりにも不明瞭なバグのあるJVM上で動作する可能性があるとは言えませんでした。確かに、その可能性は十分に小さいので、より強い言葉を使用すべきでした。訂正していただきありがとうございます。 :) –

3

いいえ、キャストする必要はありません。 通常は、この方法は、あなたのキャッシュが唯一のクラスのオブジェクト(すなわち、派生クラスをキャッシュしない)を保持している場合は、それが動作するはず

@Override 
public boolean equals(Object o){ 

    if (! o instance of ThisClass){ 
     return false; 
    } 

    //other equality tests based on members 
} 

のように見えます等しいです。 StockCacheにオブジェクトを格納しているようです。たぶんそれはあまりにも一般的で、いくつかの基本クラス(たぶんStockClass)に絞り込む方が良い選択肢になるでしょう。次に、あなたのゲッターがあなたのキャッシュクラスで定義された、でしょう次のようになります。(あなたはalredyあなたは、なぜ使用反射を比較したいオブジェクトを持っている場合は?)

StockObject getStockObject(KeyType key); 

これに加えて、反射はやり過ぎのように思える

+3

これは非常に一般的な間違いですが、equals()オーバーライドでinstanceof比較を使用することは技術的には間違いです。代わりにx.getClass()== y.getClass()を使用してください。 instanceofを使用すると、等価メソッドの対称プロパティに違反するサブクラスに対してtrueが返されます。 また、if(this == o)を使用してヌルチェックと自己参照チェックを組み合わせることもできます。 – sooniln

+1

Soonil:Collectionsはinstanceofを使用します。あなたは何をしているのかを理解する必要があります。あるいは、クラスを最終的にする。 –

+0

トム:@オーバーライドはそこでは役に立ちます。質問者がキャスティングについて質問しているので、おそらくメソッドをオーバーライドする代わりにオーバーロードされていました。また、instanceofでヌルチェックを行う必要もありません。 –

2

キャスティングはここで効果がありません。結果は、equals()メソッドがStockクラスでどのように実装されているかによってまったく異なります。

しかし、なぜこれに反射を使用していますか?たぶん正しいことではありません。

+0

Stock自体ではなく、Stock.m()の戻り値でequalsが呼び出されているようです。 –

+0

なぜリフレクションを使用しているのか聞いたことがある人は、逆のajaxフレームワークDWRを使用しています.Html idプロパティをオブジェクトプロパティにマップしようとしています。このメソッドは、オブジェクトをUIにプッシュすると、オブジェクト全体ではなく変更されたプロパティだけをプッシュすることができます。 – Karl