[RESOLVIDO] Pegando nome do parametro de um método via Reflection e Paranamer jar

6 respostas
E

Boa tarde, pessoas!

Eu estou tentando usar o jar paranamer para recuperar os nomes dos parâmetros de um método de uma classe minha - Estou usando-o em um pequeno projeto meu.

Mas, testando a paranamer - http://paranamer.codehaus.org/ - não retorna o nome do parâmetro de um método! Aqui está a classe de domínio - que é o método com o parâmetro que eu estou tentando retornar o nome:

Classe que contém o método que quero retornar o parametro:

package domain;

public class DomainTest {

private String attribute1;
private int attribute2;

public DomainTest() {

}

public DomainTest(String attribute1, int attribute2) {
    super();
    this.attribute1 = attribute1;
    this.attribute2 = attribute2;
}

public void someMethod(String paramTest) {
    System.out.println("METHOD IN DOMAIN CLASS");
}

public String getAttribute1() {
    return attribute1;
}

public int getAttribute2() {
    return attribute2;
}   

}

Classe que tenta retornar o nome do parametro do método da classe acima:

package Testes;

import java.lang.reflect.Method;

import com.thoughtworks.paranamer.CachingParanamer;
import com.thoughtworks.paranamer.Paranamer;

import domain.DomainTest;

public class Test {

public static void main(String[] args) {
    Class<?> myClass = DomainTest.class;

    System.out.println("CLASS NAME " + myClass.getCanonicalName());

    String[] ParameterNames = null;

    Paranamer paranamer = new CachingParanamer();

    for (Method method : myClass.getDeclaredMethods()) {

        System.out.println("METHOD NAME: " + method.getName());

        ParameterNames = paranamer.lookupParameterNames(method, false);

        if (ParameterNames.length > 0) {
            System.out.println("OK!");
        } else {
            System.out.println("NO!");
        }
    }

    System.out.println("TESTING!");

    for (int i = 0; i < ParameterNames.length; i++) {
        System.out.println("PARAMETER NAME " + ParameterNames[i]);
    }
}

}

Usando o jar Paranamer, seguindo as dicas de uns tópicos do stackoverflow.com , era pra estar retornando o nome dos parametros do método someMethod(), mas não está! Já estou setando o compilador do eclipse IDE pra colocar as informações de debug nos .class, mas mesmo assim não funciona!

Alguém já mexeu com isso, ou conseguiu obter o mesmo resultado com algo semelhante?

Muito obrigado desde já, abraços!

6 Respostas

A

Você já tentou passar “true” neste metodo ?

ParameterNames = paranamer.lookupParameterNames(method, false);
E

Oi Aleksandro,

Muito obrigado por estar me ajudando novamente.

Então, eu passei sim. Lendo a documentação, esse booleano indica se deve ser lançada uma ParameterNamesNotFoundException se os parametros não forem encontrados.

Passei true e false, e não funcionou. Tentei o método sobrecarregado também, que não precisa passar o booleano, e também não funcionou. Eu achei um código aqui que usa uma classe do apache pra fazer isso, que funciona certinho, mas fica complicado usar a reflection do java e misturar com a do apache.

E

Acabei de ver que o VRaptor utiliza o paranamer:

Reflection no nome dos parâmetros
Infelizmente, o Java não realiza reflection em cima de parâmetros, pois esses dados não ficam disponíveis em bytecode (a não ser se compilado em debug mode, porém é algo opcional). Isso faz com que a maioria dos frameworks que precisem desse tipo de informção criem uma anotação própria para isso, o que polui muito o código (exemplo no JAX-WS, onde é comum encontrar um método como o acima com a assinatura void add(@WebParam(name=“cliente”) Cliente cliente). O VRaptor tira proveito do framework Paranamer, que consegue tirar essa informação por meio da pré compilação ou dos dados de debug, evitando criar mais uma anotação. Alguns dos desenvolvedores do VRaptor também participam no desenvolvimento do Paranamer.

Disponível em http://vraptor.caelum.com.br/pt/docs/resources-rest-pt/

Acho que vou ter que ler as fontes dele, pelo jeito. Mas muito provavelmente deve ter alguem aqui que já trabalhou com o paranamer, e se puder ajudar, fico muito grato.

Abraços.

E

Up!

E
Paranamer paranamer = new CachingParanamer();

Não tem um AdaptiveParanamer não?

E

Na mosca, entanglement!

Eu já tinha tentado DefaultParameter e a própria CachingParameter, que também não funfava. Usando a AdaptiveParameter funcionou certinho!

Muito, mas muito obrigado mesmo!

Um grande abraço!

Criado 1 de julho de 2013
Ultima resposta 2 de jul. de 2013
Respostas 6
Participantes 3