| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/03/2009 00:22:23
|
Tiago Farias
JavaChild
![[Avatar]](/images/avatar/295f404072232ad70d1f4893912d68a3.jpg)
Membro desde: 24/02/2008 16:18:39
Mensagens: 109
Localização: Recife-PE
Offline
|
Olá galera!
Estou utilizando a lib BCEL pra analisar bytecode. Já consigo ler as estruturas básicas das classes como métodos, atributos, blocos static e etc. Agora minha dúvida é:
como retornar todos os métodos que podem anteceder a chamada de um método, digamos, m() ?
Ex: Suponha que meu no meu fluxo de programa eu tenha: a() q chama b() q chama c() ou m(). Se eu pedir os ancestrais ou predecessores de m() ele deve me mostrar a() e b(). O mesmo ocorrendo com c(), que tem como predecessores a() e b().
Qualquer ajuda será grandemente apreciada!
Vlw!
|
SCJP 6
SCWCD 5
Bacharel em Ciência da Computação - UFPE
http://tiagodev.wordpress.com
- What does a insomniac, agnostic and dislexic man do at night?
- He contemplates about the existence of an All-Mighty Dog. |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/03/2009 08:26:33
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Você pode fazer ao contrário (localizar os métodos que o método "a" chama); acho que isso é possível em BCEL. Uma vez feito isso, você pode "inverter" sua estrutura de dados.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/03/2009 09:08:11
|
Tiago Farias
JavaChild
![[Avatar]](/images/avatar/295f404072232ad70d1f4893912d68a3.jpg)
Membro desde: 24/02/2008 16:18:39
Mensagens: 109
Localização: Recife-PE
Offline
|
Entendi. Mas acho q não entendi a parte de "inverter " a estrutura de dados. Ou melhor, entendi mas não consegui encontrar ligação... Porque se eu tenho os métodos que a() chama (ex: b(), c() e d()), não significa que ao olhar para d() eu saberei que a() o chama. Entende? Não sei se foi isso q vc quis dizer... mas to no aguardo da resposta. =]
Vlw!
|
SCJP 6
SCWCD 5
Bacharel em Ciência da Computação - UFPE
http://tiagodev.wordpress.com
- What does a insomniac, agnostic and dislexic man do at night?
- He contemplates about the existence of an All-Mighty Dog. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/03/2009 09:29:44
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Basicamente você precisa inverter uma "call tree" (árvore de chamadas).
Digamos que você tenha uma lista de métodos (para simplificar, vou representar os métodos pelos seus nomes):
List <String> metodos;
E a seguir, um mapa nome do método -> nomes dos métodos chamados:
Map <String, List ><String> > metodo2chamados;
Para você determinar quais são os métodos "chamadores" (é o que você quer, na verdade), basta percorrer o mapa metodo2chamados, mais ou menos assim:
Se você olhar a saída, vai ver que é um pouco diferente do que você está esperando. É que eu estou percorrendo apenas o primeiro nível (ou seja, eu sei que quem chama diretamente c é b, mas não mostro que a chama indiretamente c. Para fazer isso direito, eu precisaria levar em conta que rotinas podem ser recursivas ou mutuamente recursivas, senão o programa entraria em loop.
This message was edited 1 time. Last update was at 26/03/2009 09:31:00
|
|
|
 |
|
|
|
|