有一天,有人可以帮我解决这个问题。
我有2个Stock Objects,我想比较运行时的属性。一个实例是缓存实例,另一个是刚刚传递到我的系统的新库存实例,它可能与缓存实例相同或不相等。请参阅下文,其中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) {
}
编辑:对于那些询问我为什么使用反射的人,我正在使用反向ajax框架DWR,我正在尝试将html id属性映射到我的对象属性,允许我使用关联的HTML注释我的属性id值。将对象推送到UI时,此方法将允许我仅推送已更改的属性而不是整个对象。
答案 0 :(得分:7)
你不应该施展。 Java将自动选择正确的equals
方法。我建议您调试该行以查看每个对象的Class
。
答案 1 :(得分:3)
不,你不需要施放。 通常,equals方法看起来像
@Override
public boolean equals(Object o){
if (! o instance of ThisClass){
return false;
}
//other equality tests based on members
}
如果你的缓存只包含一个类对象(即不缓存派生类),它应该可以工作。 看起来您正在StockCache中存储对象。也许这有点过于通用,缩小到某个基类(也许是StockClass)将是一个更好的选择。然后,你的getter将在你的缓存类中定义:
StockObject getStockObject(KeyType key);
除此之外,反射看起来像是一种矫枉过正(如果您想要比较的对象,为什么要使用反射?)
答案 2 :(得分:2)
施法不会对此产生任何影响。结果完全取决于如何在Stock类中实现equals()方法。
但是你为什么还要使用反射呢?这很可能不是正确的事情。
答案 3 :(得分:1)