Se eu tiver uma classe como esta:
public class Whatever
{
public void aMethod(int aParam);
}
existe alguma maneira de saber que aMethod
usa um parâmetro chamado aParam
, que é do tipo int
?
java
reflection
Geo
fonte
fonte
Respostas:
Para resumir:
method.getParameterTypes()
Para escrever a funcionalidade de preenchimento automático para um editor (como você afirmou em um dos comentários), existem algumas opções:
arg0
,arg1
,arg2
etc.intParam
,stringParam
,objectTypeParam
, etc.fonte
No Java 8, você pode fazer o seguinte:
Assim, para a sua turma
Whatever
, podemos fazer um teste manual:que deve ser impresso
[aParam]
se você passou o-parameters
argumento para o seu compilador Java 8.Para usuários do Maven:
Para mais informações, consulte os seguintes links:
fonte
A biblioteca Paranamer foi criada para resolver esse mesmo problema.
Ele tenta determinar os nomes dos métodos de algumas maneiras diferentes. Se a classe foi compilada com a depuração, ela pode extrair as informações lendo o bytecode da classe.
Outra maneira é injetar um membro estático privado no bytecode da classe após a compilação, mas antes de ser colocado em um jar. Em seguida, ele usa a reflexão para extrair essas informações da classe em tempo de execução.
https://github.com/paul-hammant/paranamer
Eu tive problemas ao usar esta biblioteca, mas consegui funcioná-la no final. Espero relatar os problemas ao mantenedor.
fonte
ParameterNAmesNotFoundException
consulte a classe org.springframework.core.DefaultParameterNameDiscoverer
fonte
Sim.
O código deve ser compilado com o compilador compatível com Java 8, com a opção de armazenar nomes de parâmetros formais ativados ( opção -parameters ).
Então esse trecho de código deve funcionar:
fonte
Você pode recuperar o método com reflexão e detectar seus tipos de argumento. Verifique http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html#getParameterTypes%28%29
No entanto, você não pode dizer o nome do argumento usado.
fonte
É possível e o Spring MVC 3 faz isso, mas não demorei muito para ver exatamente como.
Retirado da documentação da primavera
fonte
Embora não seja possível (como outros ilustraram), você pode usar uma anotação para substituir o nome do parâmetro e obtê-lo através de reflexão.
Não é a solução mais limpa, mas faz o trabalho. Alguns serviços da Web realmente fazem isso para manter os nomes dos parâmetros (por exemplo: implantar WSs com glassfish).
fonte
Consulte java.beans.ConstructorProperties , é uma anotação projetada para fazer exatamente isso.
fonte
Então você deve ser capaz de:
Mas você provavelmente obterá uma lista como esta:
Eu acredito que isso será corrigido no Groovy 2.5+
Então, atualmente, a resposta é:
Veja também:
Para cada método, algo como:
fonte
aMethod
. Eu quero obtê-lo para todos os métodos em uma classe.antlr
para obter nomes de parâmetros para isso?se você usar o eclipse, consulte a imagem abaixo para permitir que o compilador armazene as informações sobre os parâmetros do método
fonte
Como o @Bozho afirmou, é possível fazê-lo se as informações de depuração forem incluídas durante a compilação. Há uma boa resposta aqui ...
Como obter os nomes dos parâmetros dos construtores de um objeto (reflexão)? por @AdamPaynter
... usando a biblioteca ASM. Eu montei um exemplo mostrando como você pode alcançar seu objetivo.
Primeiro de tudo, comece com um pom.xml com essas dependências.
Então, essa classe deve fazer o que você deseja. Apenas invoque o método estático
getParameterNames()
.Aqui está um exemplo com um teste de unidade.
Você pode encontrar o exemplo completo no GitHub
Ressalvas
static
métodos. Nesse caso, o número de argumentos retornados pelo ASM é diferente, mas é algo que pode ser facilmente corrigido.fonte
Os nomes de parâmetros são úteis apenas para o compilador. Quando o compilador gera um arquivo de classe, os nomes dos parâmetros não são incluídos - a lista de argumentos de um método consiste apenas no número e nos tipos de argumentos. Portanto, seria impossível recuperar o nome do parâmetro usando reflexão (conforme marcado na sua pergunta) - ele não existe em nenhum lugar.
No entanto, se o uso da reflexão não for um requisito difícil, você poderá recuperar essas informações diretamente do código-fonte (supondo que você as tenha).
fonte
Parameter names are only useful to the compiler.
Errado. Veja a biblioteca Retrofit. Ele usa interfaces dinâmicas para criar solicitações de API REST. Um de seus recursos é a capacidade de definir nomes de espaços reservados nos caminhos da URL e substituí-los pelos nomes de parâmetros correspondentes.Para adicionar meus 2 centavos; as informações do parâmetro estão disponíveis em um arquivo de classe "para depuração" quando você usa o javac -g para compilar a fonte. E está disponível para o APT, mas você precisará de uma anotação para que não seja útil. (Alguém discutiu algo semelhante há 4-5 anos aqui: http://forums.java.net/jive/thread.jspa?messageID=13467&tstart=0 )
Em resumo, você não pode obtê-lo, a menos que trabalhe diretamente nos arquivos de origem (semelhante ao que o APT faz no momento da compilação).
fonte