Вопрос об отражении Java - PullRequest
1 голос
/ 07 мая 2009

Это был один из тех дней, когда кто-нибудь может мне помочь с этим.

У меня есть 2 объекта Stock, с которыми я хочу сравнить свойства во время выполнения. Один экземпляр - это кэшированный экземпляр, другой - новый экземпляр, который только что был доставлен в мою систему, который может равняться или не совпадать с кэшированным экземпляром. Смотрите ниже, где 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) {
 }

РЕДАКТИРОВАТЬ: Для тех, кто спрашивал о том, почему я использую отражение, я использую DWR обратного ajax-фреймворка и пытаюсь сопоставить свойство html id со своими свойствами объекта, что позволяет мне аннотировать свои свойства с помощью их связанного HTML значение идентификатора При перемещении объекта в пользовательский интерфейс этот метод позволит мне передавать только свойства, которые изменились, а не весь объект.

Ответы [ 4 ]

7 голосов
/ 07 мая 2009

Вам не нужно кастовать. Java автоматически выберет правильный equals метод. Я рекомендую вам отладить эту строку, чтобы увидеть, Class каждый объект.

3 голосов
/ 07 мая 2009

Нет, вам не нужно разыгрывать. Обычно метод equals выглядит как

@Override
public boolean equals(Object o){

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

   //other equality tests based on members
 }

Если ваш кеш содержит только один объект класса (т.е. не кэширует производные классы), он должен работать. Похоже, что вы храните объекты в вашем StockCache. Может быть, это слишком обобщенно, и сужение до некоторого базового класса (возможно, StockClass) было бы лучшим вариантом. Тогда ваш получатель будет определен в вашем классе кеша:

StockObject getStockObject(KeyType key);

В дополнение к этому отражение кажется излишним (если у вас уже есть объекты, которые вы хотите сравнить, зачем использовать отражение?)

2 голосов
/ 07 мая 2009

Кастинг здесь не будет иметь никакого эффекта. Результат полностью зависит от того, как метод equals () реализован в классе Stock.

Но почему вы всё равно используете отражение? Скорее всего, это неправильно.

1 голос
/ 29 декабря 2010

Посмотрите на это:

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

...