Interceptar métodos numa aplicação desktop

olá pessoal,

Estou com um problema aqui na empresa. Preciso que algumas chamadas de métodos sejam interceptadas para fazer alguns testes (onde posso delegar o restante da execução para um outro objeto) e gerar alguns logs. Sobre a possibilidade de delegar a execução de um método a outro objeto, esse cenário não será uma constante… é possível que, dentro do mesmo cenário, a execução seja ou não delegada, essa decisão será tomada por meio de algumas configurações. Quanto aos logs, creio que seja uma questão muito trivial para vocês. O meu problema começa no fato de ter que fazer uma alteração “não-intrusiva” nos componentes existentes. Não posso simplesmente modificar toda a lógica dos componentes para adequar à nova realidade.

Li sobre algumas formas de interceptar um método, mas todas ocorrem em aplicações que fazem uso de EJB, Spring, etc… mas esse não chega a ser o nosso caso…

Tentei utilizar CGLIB para interceptar os métodos, mas precisaria fazer algumas mudanças nos componentes interceptados (o fato de não poder usar new nos objetos que teriam os métodos interceptados se tornou um grande problema) e acabei achando que essa seria uma forma que me custaria muito desempenho. Acabei não procurando por outras soluções parecidas pensando que esbarraria num problema de desempenho.

Pensei então em utilizar AOP através do AspectJ, mas esbarrei no fato de que os pointcuts são resolvidos em tempo de compilação e isso geraria uma mudança no ambiente dos desenvolvedores envolvidos (coisa q a empresa tem grande desconfiança). Por isso comecei a buscar por implementações onde eu pudesse resolver esses pointcuts em tempo de execução, mas não encontrei nada até o momento.

Gostaria de saber se existe alguma outra forma de interceptar a execução de um método ou alguma forma de utilizar AOP de forma que os pointcuts sejam resolvidos em tempo de execução (espero não estar querendo demais…)?

Estamos migrando para o java6 (eu sei… eu sei… já fui muito apedrejado por ainda estar no java4) mas muitos de nossos clientes não estão dispostos a mudar para o java6, então a minha solução precisa funcionar no java4.

Fico grato pela atenção

[]s

Olá Eberson, faz tempo que não trabalho com aplicações desktop, mas me lembro que vc pode fazer com q sua classe implemente determinados listener’s que interceptam qualquer chamada a este tipo de evento declarado pelo listener (lembro que fazia muito isso quando trabalhava com view’s que possuiam campos monetarios e era preciso atualizar um ‘valor total’ de acordo com cada campo atualizado), não tenho nenhum exemplo agora, mas posso ver depois e te passar alguma coisa, mas creio esta seja uma possibilidade para resolver o seu problema!

Espero ter ajudado!

[]'s

Olá thiagocg,

Primeiramente, obrigado pela resposta…

Cheguei a fazer uma implementação com listeners, mas fiquei preocupado quanto ao seu funcionamento num ambiente envolvendo várias threads. Pelo que pude entender eu não tenho nenhuma garantia quanto a esse ambiente. Mesmo que eu sincronize os componentes necessários, não existe nenhuma garantia (eu ainda não pude ver e/ou entender) de as chamadas estarão enfileiradas. Por exemplo:

eu tenho 3 threads… se eu sincronizar os métodos/atributos conforme a necessidade… e todas as threads fizerem uma chamada a esse método a primeira que obter o acesso irá executar enquanto as outras duas esperam, quando a primeira liberar umas das duas que estão esperando vai obter o acesso e executar… mas não há nenhum garantia que o método será executado pelas threads na mesma ordem em que foi invocado.

No meu caso eu ficaria sujeito às threads do swing… e a falta de garantia me preocupa bastante. A implementação que fiz (utilizando listeners funcionou normalmente no meu ambiente… mas me preocupa o fato de não poder contar com algo… por isso pensei em interceptar… assim eu poderia garantir a ordem da invocação

[]s