Si j'ai un cours comme celui-ci:
public class Whatever
{
public void aMethod(int aParam);
}
y a-t-il un moyen de savoir qui aMethod
utilise un paramètre nommé aParam
, qui est de type int
?
java
reflection
Géo
la source
la source
Réponses:
Résumer:
method.getParameterTypes()
Afin d'écrire une fonctionnalité de saisie semi-automatique pour un éditeur (comme vous l'avez indiqué dans l'un des commentaires), il existe quelques options:
arg0
,arg1
,arg2
etc.intParam
,stringParam
,objectTypeParam
, etc.la source
Dans Java 8, vous pouvez effectuer les opérations suivantes:
Donc, pour votre classe,
Whatever
nous pouvons faire un test manuel:qui devrait s'afficher
[aParam]
si vous avez passé l'-parameters
argument à votre compilateur Java 8.Pour les utilisateurs Maven:
Pour plus d'informations, consultez les liens suivants:
la source
La bibliothèque Paranamer a été créée pour résoudre ce même problème.
Il essaie de déterminer les noms de méthodes de différentes manières. Si la classe a été compilée avec le débogage, elle peut extraire les informations en lisant le bytecode de la classe.
Une autre façon est d'injecter un membre statique privé dans le bytecode de la classe après sa compilation, mais avant qu'il ne soit placé dans un fichier jar. Il utilise ensuite la réflexion pour extraire ces informations de la classe au moment de l'exécution.
https://github.com/paul-hammant/paranamer
J'ai eu des problèmes avec cette bibliothèque, mais je l'ai finalement fait fonctionner. J'espère signaler les problèmes au responsable.
la source
ParameterNAmesNotFoundException
voir classe org.springframework.core.DefaultParameterNameDiscoverer
la source
Oui.
Le code doit être compilé avec un compilateur compatible Java 8 avec l'option de stockage des noms de paramètres formels activée ( option -parameters ).
Ensuite, cet extrait de code devrait fonctionner:
la source
Vous pouvez récupérer la méthode avec réflexion et détecter ses types d'arguments. Vérifiez http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html#getParameterTypes%28%29
Cependant, vous ne pouvez pas dire le nom de l'argument utilisé.
la source
C'est possible et Spring MVC 3 le fait, mais je n'ai pas pris le temps de voir exactement comment.
Tiré de la documentation du printemps
la source
Bien que ce ne soit pas possible (comme d'autres l'ont illustré), vous pouvez utiliser une annotation pour reporter le nom du paramètre et l'obtenir par réflexion.
Ce n'est pas la solution la plus propre, mais elle fait le travail. Certains webservices font en fait cela pour conserver les noms de paramètres (par exemple: déployer des WS avec glassfish).
la source
Voir java.beans.ConstructorProperties , c'est une annotation conçue pour faire exactement cela.
la source
Vous devriez donc pouvoir faire:
Mais vous obtiendrez probablement une liste comme celle-ci:
Je pense que cela sera corrigé dans Groovy 2.5+
Alors actuellement, la réponse est:
Voir également:
Pour chaque méthode, alors quelque chose comme:
la source
aMethod
. Je veux l'obtenir pour toutes les méthodes d'une classe.antlr
pour obtenir des noms de paramètres pour cela?si vous utilisez l'éclipse, consultez l'image ci-dessous pour permettre au compilateur de stocker les informations sur les paramètres de méthode
la source
Comme @Bozho l'a déclaré, il est possible de le faire si des informations de débogage sont incluses lors de la compilation. Il y a une bonne réponse ici ...
Comment obtenir les noms de paramètres des constructeurs d'un objet (réflexion)?par @AdamPaynter
... en utilisant la bibliothèque ASM. J'ai rassemblé un exemple montrant comment vous pouvez atteindre votre objectif.
Tout d'abord, commencez par un pom.xml avec ces dépendances.
Ensuite, cette classe devrait faire ce que vous voulez. Appelez simplement la méthode statique
getParameterNames()
.Voici un exemple avec un test unitaire.
Vous pouvez trouver l'exemple complet sur GitHub
Mises en garde
static
méthodes. C'est parce que dans ce cas, le nombre d'arguments renvoyés par ASM est différent, mais c'est quelque chose qui peut être facilement corrigé.la source
Les noms de paramètres ne sont utiles que pour le compilateur. Lorsque le compilateur génère un fichier de classe, les noms de paramètres ne sont pas inclus - la liste d'arguments d'une méthode se compose uniquement du nombre et des types de ses arguments. Il serait donc impossible de récupérer le nom du paramètre en utilisant la réflexion (comme indiqué dans votre question) - il n'existe nulle part.
Cependant, si l'utilisation de la réflexion n'est pas une exigence absolue, vous pouvez récupérer ces informations directement à partir du code source (en supposant que vous les ayez).
la source
Parameter names are only useful to the compiler.
Faux. Regardez la bibliothèque Retrofit. Il utilise des interfaces dynamiques pour créer des requêtes d'API REST. L'une de ses fonctionnalités est la possibilité de définir des noms d'espace réservé dans les chemins d'URL et de remplacer ces espaces réservés par les noms de paramètres correspondants.Pour ajouter mes 2 cents; Les informations de paramètre sont disponibles dans un fichier de classe "pour le débogage" lorsque vous utilisez javac -g pour compiler la source. Et il est disponible pour APT mais vous aurez besoin d'une annotation donc inutile. (Quelqu'un a discuté de quelque chose de similaire il y a 4-5 ans ici: http://forums.java.net/jive/thread.jspa?messageID=13467&tstart=0 )
Dans l'ensemble, vous ne pouvez l'obtenir que si vous travaillez directement sur les fichiers source (similaire à ce que fait APT au moment de la compilation).
la source