Recuperar dinamicamente um método e seus parâmetros, como fazer?

Olá!

Seguinte estou querendo tentar centralizar o log em um unico metodo, nele eu deveria receber o método que o chamou.
Estaticamente isto até é possível, apesar de só conseguir pegar o nome do método e pode haver mais de um com mesmo nome, o que acontece muito no meu caso… Mas além disto eu precisava pegar o método em runtime ou seja não pegar o método e saber quais os parâmetros que ele recebe e sim recuperar os valores reais que lhe foram passados e também os nomes dados a seus parâmetros. Algo mais ou menos assim:

ClasseA{
    public void fazNada(int i, String s){
        //ocorre um erro, chama o log
        ClasseLog.log();//tentar evitar ao máximo enviar parametros,, tentar recuperar dinamicamente
    }
}
ClasseLog{
    public void log(){
        //pelo stack trace recupero a string do metodo que chamou o log() mas não consigo obter o objeto em si

       logger.error("mensagem"+metodo+paramNome1+paramValor1,paramNome2+paramValor2,paramNome3+paramValor3...);
    }
}

Sei que o log4j até consegue obter o nome do método, mas o nome dado aos parâmetros e seus valores ele não faz (eu acho).
Alguém já tentou algo assim? Mesmo que alguns julguem que não é um bom caminho para executar os logs (o que provavelmente acho que será a maioria das respostas), eu realmente quero tentar este caminho e não gostaria de ser impedido por uma limitação da linguagem, assim se souberem como fazer, por favor, compartilhem :wink:

Detalhando mais: Sei que poderia chamar o log passando um tipo de chave/valor com nomeParam/valorParam, mas não queria que meu metodo tivesse que fazer esses tratamentos até pq são muitos e está dificil de automatizar e garantir que está tudo ok, pq acaba sendo um copia/cola danado dessa parte do código e sempre algo acaba passando batido e não posso lá na frente recuperar no log um erro que indica um metodo/valores errados do real.

De maneira automática… nao tem como pegar esses valores…

Você pode usar orientação a aspectos… aí vc nao vai sujar seu código e consegue resolver esse problema de forma elegante…

O que é Programação Orientada a Aspectos?
http://www.javaframework.org/portal/2010/04/14/o-que-programao-orientada-a-aspectos/

Valeu rogelgarcia, me pareceu uma boa idéia, mas não ficou claro como iria recuperar os nomes e valores do método em runtime, entende?

Vc terá que criar um aspecto… e no aspecto você terá acesso a essas informações…

Veja por exemplo no vídeo que fiz no tutorial do Log… vc vai usar os mesmos recursos…

Tem um reflection mais poderoso na AOP que te permite pegar as informacoes… mas teria que dar uma estudada lá…

Pseudo código:

void meuMetodo(String param1, String param2){
   // código
}

//NO ASPECTO
pointcut todosOsMetodos() : *.* (pega todos as chamadas de métodos do meu sistema)

advice antes de todosOsMetodos(metodoSendoChamado): {
     List<Parameter> params = metodoSendoChamado.getParameters();
     for(Parameter param: params){
        param.getName()
        param.getValue()
     }
}

Mais ou menos isso…

Quando seu programa for compilado… antes de chamada de todos os seus métodos o advice será chamado… com todas as informacoes da chamada do método…

Voce terá uma etapa a mais na compilação para injetar essa sua chamada… é interessante usar um plugin…

Plugin do eclipse: http://www.eclipse.org/ajdt/

Agora ficou bem mais claro, vou fazer um exemplo aqui e ver se aceitam adicionar aspecto no projeto.

obrigado

[quote=fausto]Agora ficou bem mais claro, vou fazer um exemplo aqui e ver se aceitam adicionar aspecto no projeto.
[/quote]

É… aí é que começam os problemas… pode haver resistencia… heheh

Mas me fala aqui… o que acontecer nas discussões sobre adicionar ou não aspectos ao projeto…