Mudar classe em tempo de execução

Tem como mudar o código de uma classe em tempo de execução no JME?

Vc realmente precisa alterar A CLASSE em tempo de execução?

Alterar seu comportamento, talvez via strategy(http://en.wikipedia.org/wiki/Strategy_pattern) não seria suficiente para seu caso?

Abs

CGLIB e Java Assist permitem manipulação de bytecode em runtime.

O javassist eu estou usando.
Eu tive problema quando tentei usar esta API dentro de um aplicativo mobile, não compilou.
E em relação design parttner eu acho que não vai ajudar muito.
Porque eu quero “alterar” um método da classe MIDlet, para ser mais exato quero incluir algumas linhas no início do método.

Descreva um pouco melhor o que vc precisa fazer amigo, tenho quase certeza que strategy vai te ajudar sim.

Me diga seu cenário(o q vc quer fazer a mais) e eu te digo como o Strategy se encaixa ai, se for o caso.

Outra alternativa não tão usual seria a utilização de aspectos para interceptar a chama a seu método, visto q vc disse que quer colocar código no inicio do método, acho q caberia nesse caso.

De qq forma, ainda acredito que o Strategy caiba ai.

Abs

Eu tenho que interceptar a chamada ao método MIDlet.notifyDestroy() de uma aplicação mobile.
Por exemplo, quando a aplicação chamar este método eu quero mostrar uma tela antes da aplicação “morrer”.

Não manjo nada de mobile, mas vamos lá.

Esse método é static?

Caso não seja, vc não pode criar uma subclasse dessa sua classe e dar override nesse método de forma que ele faça o que vc deseja, e então, dps disso, chama super.notifyDestroy ?

O problema que o método é final.

hehe, a idéia é vc não dar override nele então :slight_smile:

Se o método é final, deve haver um bom motivo, o que me leva a crer que o que vc quer fazer não é boa idéia.

Imagino que esse seja o método final do lifecycle do midlet e é final justamente pra vc não fazer nada que impeça o objeto de ser destruído(como mostrar uma janela com algo :slight_smile: etc )

Acho melhor vc procurar por algo no método destroyApp, pelo visto, é nele que vc deve concentrar a lógica que vc deseja, não aconselho vc a seguir na idéia de fazer algo contra a especificação.

abs

Ai é que está o problema, eu também via o método destroyApp para isso, “matar a aplicação”.
Mas tem programas que chamam direto o método notifyDestroyed. Por isso que eu queria incluir código neste método.

Se você ler a especificação JME verá que a kvm é uma versão bem minima da JVM. Digamos uma versão pelada. Ou seja, muita coisa que você pode fazer no “java normal” não conseguirá.

É isso em relação a KVM eu sei.
Pelo visto vou ter que mudar a minha estratégia, porque já estou procurando uma solução para este problema a uns dias.
Vocês sabem se tem como varrer um código dentro de um .class atrás de uma linha de código? Isso seria no JSE.

GraveDigger,

Estou com um problema que talvez possa me ajudar. Tenho uma classe A que extends Canvas, nela subscrevo o método abstract keyPressed(). Pois bem, preciso que este método trate os eventos do teclado de acordo com o desejado ao decorrer da execução. Ou seja, hora trate um botão de uma forma, outra hora trata o mesmo botão de forma totalmente diferente, de acordo com o que for necessário. É possivel resolver isso com algum padrão de projeto? Como + ou - funciona o Strategy que citou acima? Será que ele resolveria esse problema?

Obrigado.