Вопрос об отражении Java
-
08-07-2019 - |
Вопрос
Это был один из тех дней, когда кто-нибудь может мне помочь с этим.
У меня есть 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 значение идентификатора При перемещении объекта в пользовательский интерфейс этот метод позволит мне передавать только измененные свойства, а не весь объект.
Решение
Вам не нужно кастовать. Java автоматически выберет правильный метод equals
. Я рекомендую вам отладить эту строку, чтобы увидеть, что Class
каждый объект.
Другие советы
Нет, вам не нужно кастовать. Обычно метод 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);
В дополнение к этому отражение кажется излишним (если у вас уже есть объекты, которые вы хотите сравнить, зачем использовать отражение?)
Кастинг здесь не будет иметь никакого эффекта. Результат полностью зависит от того, как метод equals () реализован в классе Stock.
Но почему вы все равно используете отражение? Скорее всего, это не правильно.
Посмотрите на это: