Qual método me chamou?  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
victorwss
JWizard
[Avatar]

Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline

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?

Victor Williams Stafusa da Silva

Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.

Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.

Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.


É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).


Se você escreve "concerteza", "concerteza" você andou matando aulas de português.
[MSN]
cmoscoso
Virtual Machine Man

Membro desde: 23/10/2007 10:08:29
Mensagens: 687
Offline

victorwss wrote: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;
[Email]
thingol
Moderador

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

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.
[WWW]
victorwss
JWizard
[Avatar]

Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline

cmoscoso wrote:
victorwss wrote: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.

thingol wrote: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.


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

This message was edited 1 time. Last update was at 15/10/2008 13:24:16


Victor Williams Stafusa da Silva

Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.

Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.

Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.


É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).


Se você escreve "concerteza", "concerteza" você andou matando aulas de português.
[MSN]
thingol
Moderador

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

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.

This message was edited 1 time. Last update was at 15/10/2008 13:27:04

[WWW]
cmoscoso
Virtual Machine Man

Membro desde: 23/10/2007 10:08:29
Mensagens: 687
Offline

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

Porque mesmo vc quer depender de quem chamou o metodo?

This message was edited 1 time. Last update was at 15/10/2008 13:30:29

[Email]
victorwss
JWizard
[Avatar]

Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline

cmoscoso wrote:Mas porque mesmo vc quer depender de quem chamou o metodo?


É 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.

This message was edited 2 times. Last update was at 15/10/2008 13:34:18


Victor Williams Stafusa da Silva

Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.

Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.

Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.


É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).


Se você escreve "concerteza", "concerteza" você andou matando aulas de português.
[MSN]
cmoscoso
Virtual Machine Man

Membro desde: 23/10/2007 10:08:29
Mensagens: 687
Offline

victorwss wrote:
É 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?
[Email]
victorwss
JWizard
[Avatar]

Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline

cmoscoso wrote:
victorwss wrote:
É 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.

This message was edited 1 time. Last update was at 15/10/2008 13:53:40


Victor Williams Stafusa da Silva

Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.

Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.

Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.


É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).


Se você escreve "concerteza", "concerteza" você andou matando aulas de português.
[MSN]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team