Ajuda com ASM  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
Jedi_FeniX
Virtual Machine Man
[Avatar]

Membro desde: 26/04/2007 14:32:30
Mensagens: 586
Offline

A alteração que quero fazer é deste tipo.

A minha aplicação abre o .class e modifica a chamada de um método.

Original:


Modificado:

www.bau-de-dev.com
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Só isso? Se o método tiver exatamente a mesma assinatura, então você só precisa implementar visitMethodInsn; você troca a chamada a methodA por uma chamada a methodB.

Se tiver assinatura diferente (por exemplo, um parâmetro a mais), então é mais complicado porque você precisa remover ou adicionar código, e isso não é trivial.
[WWW]
Jedi_FeniX
Virtual Machine Man
[Avatar]

Membro desde: 26/04/2007 14:32:30
Mensagens: 586
Offline

Bom, como o meu tempo é pequeno tem como "fazer" a assinatura do método ser a mesma para que fique mais fácil.
Você teria algum exemplo de como eu posso fazer esta modificação? E outra coisa eu teria que varrer o .class inteiro atrás do methodA().

www.bau-de-dev.com
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Você entendeu como é que se usa o ASM?
Ele usa o pattern "visitor".
Então você carrega o .class com o ASM e então o ASM chama uma classe que você define; para cada classe de bytecodes (como invokespecial, invokevirtual etc.) existe um método determinado, que você pode sobrecarregar ou não.
Sobrecarregar esse método é definir o que fazer quando você encontrar a tal instrução.
No seu caso, para todas as instruções, exceto visitMethodInsn, você simplesmente deixa a instrução do jeito que está. Mas visitMethodInsn deve mudar a chamada de methodA para methodB.
[WWW]
Jedi_FeniX
Virtual Machine Man
[Avatar]

Membro desde: 26/04/2007 14:32:30
Mensagens: 586
Offline

Aí que está eu ainda não entendi muito bem, fui no site do ASM, mas achei complicada a explicação deles.
Você teria algum outro material para indicar? Baixei do site do ASM alguns exemplos, mas mesmo assim está difícil de entender.
Gostaria de agradecer a ajuda que vc está dando!!!! Valeu!!!!

www.bau-de-dev.com
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Use o javassist então; o ASM é reconhecidamente difícil de usar; se estiver com pressa não é a ferramenta mais indicada para usar.
[WWW]
Jedi_FeniX
Virtual Machine Man
[Avatar]

Membro desde: 26/04/2007 14:32:30
Mensagens: 586
Offline

O javassist perto do ASM é uma "Mãe", muito fácil de usar.
O problema que com ele eu não consigo fazer essa funcionalidade, percorrer um bytecode atrás de um método e mudar o método.
Você sabe se tem como percorrer um bytecode com javassist? Por exemplo, pego um .class entro no methodA e vejo o que tem no escopo do método, depois entro no methodB vejo o que tem no escopo do método, faço a alteração e depois vou para ooutro método e etc...

www.bau-de-dev.com
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

redirectMethodCall

This message was edited 2 times. Last update was at 26/05/2009 15:40:59

[WWW]
Jedi_FeniX
Virtual Machine Man
[Avatar]

Membro desde: 26/04/2007 14:32:30
Mensagens: 586
Offline

Cara valeu pela ajuda este método me ajudou muito!!!
Só que cai em uma situação bem chata.
Aonde eu tenho que trocar uma objeto que chama um metodo por uma chamada de um objeto com método static.
Por exemplo:

Original:



Modificado:


Tentei usar os métodos da classe CodeConverter que você passou na outra solução, mas não tive muito sucesso.

www.bau-de-dev.com
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

NO seu caso, provavelmente você terá de usar outra classe ( javassist.expr.MethodCall ) - http://www.csg.is.titech.ac.jp/~chiba/javassist/html/javassist/expr/MethodCall.html - e você terá de dar uma olhada no método replace.
Veja: http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial2.html

DISCLAIMER - nem baixei o Javassist e nem cheguei a mexer com ele; tudo que estou lhe afirmando é resultado de ler a documentação. Espero que "replace" ajude, mas não posso garantir o resultado.
[WWW]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team