Qual método me chamou?

8 respostas
victorwss

Oi, já vi isso em algum lugar, mas não consegui achar.

Tenho um método x(), e quero que ele seja capaz de determinar a partir de qual método ele foi invocado.

new Exception().getStackTrace()[1] não resolve porque eu só consigo saber o nome do método mas não a assinatura.

Alguém tem uma idéia?

8 Respostas

C

victorwss:
Oi, já vi isso em algum lugar, mas não consegui achar.

Tenho um método x(), e quero que ele seja capaz de determinar a partir de qual método ele foi invocado.

new Exception().getStackTrace()[1] não resolve porque eu só consigo saber o nome do método mas não a assinatura.

Alguém tem uma idéia?

Assinatura pega via reflection;

T

Puxa, é meio desajeitado mesmo - já que StackTraceElement só dá o nome do método. Você pode pegar o número da linha e, com o código-fonte original, achar o overload adequado, mas é bem trabalhoso.

victorwss

cmoscoso:
victorwss:
Oi, já vi isso em algum lugar, mas não consegui achar.

Tenho um método x(), e quero que ele seja capaz de determinar a partir de qual método ele foi invocado.

new Exception().getStackTrace()[1] não resolve porque eu só consigo saber o nome do método mas não a assinatura.

Alguém tem uma idéia?

Assinatura pega via reflection;

O problema é a sobrecarga de métodos. Tendo apenas o nome dele, não dá para saber qual dos métodos sobrecarregados chamou.

Não posso assumir que o código-fonte está disponível. :’(

T

Imagino que, com o ASM ( asm.objectweb.org ) você possa até determinar os números das linhas em que os diversos métodos foram definidos (com o .class da classe que contém o tal método ) , mas deve dar um bom trabalho.

(Suponho que o .class está com a informação de depuração ; se estiver, os números das linhas estarão disponíveis).

Na prática, se você não tem o costume de efetuar muitos overloads em uma classe (que é o caso de 98% das classes que você usa), não deveria ocasionar problemas tão sérios assim, mas em determinadas condições você não saber a assinatura pode ser problemático.

C

Depois de todas as opcoes que o thingol deu me veio essa pergunta:

Porque mesmo vc quer depender de quem chamou o metodo?

victorwss

É para fazer um framework de rastreamento de chamadas de métodos (para log e debug), sem ter que ficar copiando e colando o nome do método e a assinatura em cada invocação.

Se a chamada se resumir a instanciar uma classe anônima que é subclasse de uma abstrata, eu consigo resolver via Class.getEnclosingClass(), Class.getEnclosingMethod() e Class.getEnclosingConstructor(). Mas ter que ficar instanciado classes anônimas aonde deveria haver uma simples chamada a um método é muito gambi.

C

Ja vi sendo feito assim. Neste caso como a assinatura era padronizada(!) copiava apenas o metodo.


Se a chamada se resumir a instanciar uma classe anônima que é subclasse de uma abstrata, eu consigo resolver via Class.getEnclosingClass(), Class.getEnclosingMethod() e Class.getEnclosingConstructor(). Mas ter que ficar instanciado classes anônimas aonde deveria haver uma simples chamada a um método é muito gambi.

Nao da pra isolar esse codigo de suporte em decorators?

victorwss

cmoscoso:
victorwss:

É para fazer um framework de rastreamento de chamadas de métodos (para log e debug), sem ter que ficar copiando e colando o nome do método e a assinatura em cada invocação.

Ja vi sendo feito assim. Neste caso como a assinatura era padronizada(!) copiava apenas o metodo.


Se a chamada se resumir a instanciar uma classe anônima que é subclasse de uma abstrata, eu consigo resolver via Class.getEnclosingClass(), Class.getEnclosingMethod() e Class.getEnclosingConstructor(). Mas ter que ficar instanciado classes anônimas aonde deveria haver uma simples chamada a um método é muito gambi.

Nao da pra isolar esse codigo de suporte em decorators?

Acho que ele só conseguiria ver o decorator com isso. Mas não sei, talvez tenha.

Criado 15 de outubro de 2008
Ultima resposta 15 de out. de 2008
Respostas 8
Participantes 3