Mudar classe em tempo de execução

12 respostas
Jedi_FeniX

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

12 Respostas

GraveDigger

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

otavio

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

Jedi_FeniX

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.

GraveDigger

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

Jedi_FeniX

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”.

GraveDigger

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 ?

Jedi_FeniX

O problema que o método é final.

GraveDigger

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

Jedi_FeniX

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.

otavio

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á.

Jedi_FeniX

É 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.

rafaelSaqueli

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.

Criado 18 de maio de 2009
Ultima resposta 18 de mai. de 2009
Respostas 12
Participantes 4