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
thingol
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
thingol
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
cmoscoso
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
cmoscoso
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.