1

这是那些日子之一,有人可以帮我解决这个问题。

我有 2 个库存对象,我想在运行时比较它们的属性。一个实例是缓存实例,另一个是刚刚交付到我的系统的新库存实例,它可能等于也可能不等于缓存实例。见下文,其中 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 属性映射到我的对象属性,从而允许我使用它们关联的 HTML id 值来注释我的属性。将对象推送到 UI 时,此方法将允许我仅推送已更改的属性,而不是整个对象。

4

4 回答 4

7

你不应该需要投射。Java 会自动选择正确的equals方法。我建议您调试该行以查看Class每个对象是什么。

于 2009-05-07T13:50:35.900 回答
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);

除此之外,反射似乎有点过头了(如果你已经有了想要比较的对象,为什么还要使用反射?)

于 2009-05-07T13:56:36.853 回答
2

铸造在这里不会有任何影响。结果完全取决于如何在 Stock 类中实现 equals() 方法。

但是你为什么要为此使用反射呢?这很可能不是正确的做法。

于 2009-05-07T14:04:14.837 回答
1

看看这个:

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

于 2010-12-29T15:32:05.317 回答