Olá pessoal,
Estou encarando uma parada dura por aqui e gostaria de saber se voces não podem me ajudar, preciso chamar da classe mãe um método da classe filha por reflection. A classe mãe tem que ser genérica, isto é, serve para qualquer método da filha, não importando quantos parâmetros ou os tipos que a filha retorna.
Isto vai servir para padronizar os tratamentos de exceção aqui e logs que somos obrigados a fazer.
Bom, vou dar um exemplo em codigo se eu não fui muito claro
public class ClasseMamae {
public void callFilhaMethod (sei lah quantos parametros) {
//executa algumas coisas padrão....
try {
chamaOMetodoDaFilha(osParametrosdometodo);
} catch Exception excecao{
//tratamento de exceção padrão
}
//executa mais algumas coisas padrao
}
}
public class ClasseFilha extends ClasseMamae {
public void metodoDaFilha(osParametrosdometodo) throws Exception {
//executa o negocio da aplicacao
}
}
Bom, qualquer coisa ajuda, documentação, dica de link, sei lah
Grato desde já
Gabriel Thiesen
Praticamente tudo o que você precisaria sobre reflexão está aqui:
http://jakarta.apache.org/commons/beanutils/
Mas se vc tem um objeto do tipo B, que estende A, mesmo trabalhando com o tipo A, você usa os métodos reescritos em B.
Nao esta claro o seu problema. Como o Destro disse, ja vai funcionar da maneira como vc espera por padrao.
Rafael
Tudo bem, o problema é quando eu tenho mais que um método em B e A precisa chamar qualquer um deles através do método chamaOMetodoDaFilha ().
Como na superclasseA eu só vou ter o método chamaOMetodoDaFilha enquanto em B posso ter metodo FilhaMané, FilhaGoiaba, FilhaLaranja. E a idéia é que todos esses métodos sejam chamados por A através do mesmo método chamaOMetodoDaFilha .
Não encontrei nenhuma maneira “não chucho”, disso ser implementado a não ser por reflection.
Aqui onde eu trabalho temos uma série de padrões de tratamento de Exceção e Log que são padrão entre as camadas de servico e negócio. A idéia é retirar das implementações coisas repetitivas, detalhes técnicos como os citados e focar o desenvolvimento onde ele realmente deve ser focado, no negócio da aplicação. Assim me surgiu essa alternativa de criar esse “miniframework” utilizando reflection para o tratamento dos diversos métodos. Assim ganhamos em tempo de desenvolvimento e centralizamos os eventuais Tratamento de log e Exceção.
Quando eu mandei o post aqui eu estava em busca da resposta. Agora eu tenho a resposta e não gostei do que vi . Busquei no google e achei um artigo (aparentemente respeitado) que dizia que no Java 1.3 uma implementação utilizando reflection aumenta em aproximadamente 40x o custo em desempenho, enquanto no java 1.4 esse numero já cai para 2x.
O problema é que o cliente que temos aqui não abre mão (ainda) do java 1.3 em suas implementações, sendo portanto reflection inviável por aqui.
Agradeco a ajuda e bola pra frente que atrais vem gente hehehe
Abracos
Gabriel Thiesen
Tem algo estranho no seu modelo. Pq o Pai precisa chamar os metodos do Filho, ao inves do filho fazer isso diretamente? O que vc fez foi usar o pattern Template Method (bom, vc deve saber ja ) e, se precisa tanto que Pai chame outros metodos “genericos”, faca-os serem parte do contrato da classe Pai.
Rafael
Sim a idéia era realmente um Template…
parte do contrato de Pai? voce diz métodos abstratos em pai com as assinaturas dos métodos em filhos?
Se for isso, pai deixa de ser genérico e passa a ser dependente dos filhos que implementam ele.
Abraços
Gabriel Thiesen
A ideia seria que pai fosse chamado, com os parâmentros, passados ele saberia qual é o filho que deve acessar, qual o método do filho deve executar e tratar a exceção e log de forma padronizada.
Se eu colocar as assinaturas dos metodos do filho no pai minha classe deixa de ser genérica para todos os filhos que eu venha a implementar. Cada novo método de filho eu teria que possuir um método abstrato em pai que seria utilizado nele mesmo. Essa eh exatamente a filosofia de template method, que atualmente não é a solução que procuro.
A solução que tive aqui, sem utilizar reflection (que já é um puta desafio ), é uma classe Util estática que resolve o meu problema de padronização.
Não é a melhor solução, ou pelo menos não é o que eu procurava, mas funciona
Parece que herança não é a solução pro seu caso.
Teria alguma sugestão?
Eu já desisti, sem reflection é impossivel, agora sem heranca?
Obrigado
Gabriel Thiesen
Qual o seu problema, na verdade?
Você não sabe como chamar um método por reflection? Leia o tutorial (artigo) que tem aqui no GUJ. Ele fala tudo!
Eu já ví algo do tipo que você quer, e achei ruim, mas é viável.
O método da classe pai, de qq forma é parte do objeto da classe filha. Não tem como separar isso.
Se você tem:
A a = new B();
Por reflection, em um método definido em A, você pode chamar um método de B, numa boa.
E sem herança… bom, que tal usar composição?