Domanda

È stato uno di quei giorni qualcuno può aiutarmi con questo.

Ho 2 oggetti Stock di cui voglio confrontare le proprietà in fase di esecuzione. Un'istanza è l'istanza memorizzata nella cache, l'altra è una nuova istanza stock che è appena stata consegnata al mio sistema, che può essere uguale o meno all'istanza memorizzata nella cache. Vedi sotto dove m è un metodo della classe Stock e stock è un'istanza di 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) {
 }

MODIFICA: Per coloro che hanno chiesto perché sto usando la riflessione, sto usando il DWR framework ajax inverso e sto provando a mappare una proprietà id html sulle proprietà dei miei oggetti, permettendomi di annotare le mie proprietà con il loro HTML associato valore id. Quando si spinge l'oggetto nell'interfaccia utente questo metodo mi consentirà di inviare solo le proprietà che sono state modificate e non l'intero oggetto.

È stato utile?

Soluzione

Non dovresti aver bisogno di lanciare. Java sceglierà automaticamente il metodo equals corretto. Ti consiglio di eseguire il debug di quella riga per vedere quale Class è ogni oggetto.

Altri suggerimenti

No, non è necessario eseguire il cast. Normalmente, il metodo uguale è

@Override
public boolean equals(Object o){

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

   //other equality tests based on members
 }

Se la cache contiene solo un oggetto classe (ovvero non memorizzazione nella cache di classi derivate), dovrebbe funzionare. Sembra che tu stia archiviando oggetti nel tuo StockCache. Forse è un po 'troppo generico e il restringimento a qualche classe di base (forse StockClass) sarebbe un'opzione migliore. Quindi, il tuo getter sarebbe, definito nella tua classe di cache sarebbe:

StockObject getStockObject(KeyType key);

Inoltre, il riflesso sembra eccessivo (se hai già gli oggetti da confrontare, perché usare il riflesso?)

Il casting non avrà alcun effetto qui. Il risultato dipende interamente da come viene implementato il metodo equals () nella classe Stock.

Ma perché stai usando la riflessione per questo comunque? Molto probabilmente non è la cosa giusta da fare.

Dai un'occhiata a questo:

http://code.google.com/p/simplestuff

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top