Reflection

6 respostas
P

Alguem sabe se existe alguma forma de identificar o nome do metodo que o objecto X teve seu metodo acionado ?

Por exemplo:

Class X {
   public void metodoX()
  {
  
   }
}

Class Y {
   public void metodoY()
  {
     X x = new X();
     x.metodoX();
   }
}

Tem como eu identificar que o metodo que chamou x.metodoX() foi metodoY() ?

ki confusão !!! :shock:

vlw

6 Respostas

T

Tem, mas não com Reflection, e sim com um truque (crie um Throwable, e chame o método getStackTrace.

A

Mais facil você padronizar as chamadas desse tipo enviando um parametro tipo Method
ex:

Class X {
    public void metodoX(Method quemChama)
   {
       System.out.println(quemChama.getName());
    }
 }
 
 Class Y {
    public void metodoY()
   {
      X x = new X();
      try {
 	   x.metodoX(this.getClass().getMethod("metodoY", null));
      } catch (Exception e) { e.printStackTrace(); }
    }
 }

ou é claro, enviando ao invés e uma classe Method, apenas uma string contendo a informação de classe e método

P

vlw pessoal !

eu estou procurando alguma coisa que fique transparente pra quem chamar a classe que precisa desta informação.

implementei isso, conforme thingol tinha sugerido

String retorno = null;
		Throwable c = new Throwable();
		StackTraceElement[] x = c.getStackTrace();
		
		for (int i = 0; retorno==null&&i<x.length;i++)
		{
			if (!NOME_CLASSE.equals(x[i].getClassName()))
				retorno = x[i].getMethodName();
		}
		return(retorno);

>

fabiofalci

Olá!

Pode usar AOP

T

Esse truque (usar getStackTrace) não funciona direito com .NET.
Em .NET o otimizador pode efetuar “inlining” dos métodos, tal como em Java, mas o equivalente do getStackTrace em .NET não tem a informação “não-otimizada” que é necessária para dizer que rotina chamou a sua rotina. Então às vezes você não consegue saber quem chamou a sua rotina, mas quem chamou a rotina que chamou a sua rotina (se apenas um nível de “inlining” tiver sido efetuado pelo runtime do .NET.

Mauricio_Linhares

pm:
vlw pessoal !

eu estou procurando alguma coisa que fique transparente pra quem chamar a classe que precisa desta informação.

No Java 1.5 já é possível fazer isso simplesmente pedindo essa informação a Thread corrente -&gt http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#getStackTrace()

Criado 18 de junho de 2007
Ultima resposta 19 de jun. de 2007
Respostas 6
Participantes 5