| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/05/2009 12:32:32
|
Jedi_FeniX
Virtual Machine Man
![[Avatar]](/images/avatar/06ab8d9df63b836129099247301c038b.jpg)
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 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/05/2009 12:36:37
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/05/2009 12:40:34
|
Jedi_FeniX
Virtual Machine Man
![[Avatar]](/images/avatar/06ab8d9df63b836129099247301c038b.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/05/2009 13:04:18
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/05/2009 13:12:06
|
Jedi_FeniX
Virtual Machine Man
![[Avatar]](/images/avatar/06ab8d9df63b836129099247301c038b.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/05/2009 13:41:34
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/05/2009 13:45:53
|
Jedi_FeniX
Virtual Machine Man
![[Avatar]](/images/avatar/06ab8d9df63b836129099247301c038b.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/05/2009 15:39:33
|
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/05/2009 11:10:05
|
Jedi_FeniX
Virtual Machine Man
![[Avatar]](/images/avatar/06ab8d9df63b836129099247301c038b.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/05/2009 14:22:49
|
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.
|
|
|
 |
|
|