Java Reflection Igual Pergunta
-
08-07-2019 - |
Pergunta
Tem sido um daqueles dias alguém pode me ajudar com isso.
Eu tenho 2 objetos de Stock qual deseja comparar propriedades em tempo de execução. Um exemplo é a instância em cache, o outro é uma nova instância da que acaba de ser entregue ao meu sistema, que pode ou não pode ser igual à instância em cache. Veja abaixo onde m é um método de classe do estoque e estoque é uma instância de da
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) {
}
EDIT: Para aqueles que têm perguntado sobre por que estou usando a reflexão, estou usando o inverso DWR quadro ajax e estou tentando mapear uma propriedade html id para meus propriedades do objeto, permitindo-me para anotar minhas propriedades com o seu HTML associado valor id. Ao empurrar o objeto para o UI este método vai permitir-me a empurrar única propriedades que foram alteradas e não o objeto inteiro.
Solução
Você não deve precisar de elenco. Java irá escolher automaticamente o método equals
correta. Eu recomendo que você depurar essa linha para ver o que Class
cada objeto é.
Outras dicas
Não, você não precisa elenco. Normalmente, é igual a método se parece com
@Override
public boolean equals(Object o){
if (! o instance of ThisClass){
return false;
}
//other equality tests based on members
}
Se o seu cache armazena apenas uma classe-objetos (isto é, não o cache de classes derivadas), ele deve funcionar. Se parece que você está armazenando objetos no seu StockCache. Talvez isso seja um pouco demasiado genérica, e estreitando para baixo a alguma classe base (talvez StockClass) seria uma opção melhor. Em seguida, o getter seria, definido na sua classe de cache seria:
StockObject getStockObject(KeyType key);
Além disso, a reflexão parece ser um exagero (se você alredy ter os objetos que você quiser comparar, por que usar reflexão?)
Fundição não terá qualquer efeito aqui. O resultado depende inteiramente de como os equals () método é implementado na classe Stock.
Mas por que você está usando a reflexão para isso de qualquer maneira? É mais provável que não é a coisa certa a fazer.
Tenha um olhar para isto: