web-dev-qa-db-fra.com

Obtenir le nom d'un paramètre de méthode

Dans Java 6 , imaginez que j'ai la signature de méthode suivante:

public void makeSandwich(Bread slice1, Bread slice2, List<Filling> fillings, boolean mustard)

J'aimerais connaître, au moment de l'exécution, la valeur qui a été transmise à slice2 ou à tout autre paramètre. Le bit important ici est que je veux obtenir la valeur par nom de paramètre.

Je sais comment obtenir la liste des types de paramètres avec getParameterTypes ou getGenericParameterTypes.

Idéalement, j'aimerais obtenir une liste de paramètres noms au lieu de types. Y a-t-il un moyen de le faire?

18
Tiago Veloso

Les noms de paramètres sont disponibles si vous avez dit au compilateur de les inclure (compiler avec les informations de débogage). Spring a ParameterNameDiscoverer qui peut vous aider à obtenir les noms. L'implémentation default utilise asm ClassReader pour le faire.

Avec javac, vous devez inclure l’argument -g pour inclure les informations de débogage. Avec Eclipse, je pense que c’est là par défaut; il peut être configuré en utilisant les préférences: Java -> Compilateur, puis activez "Stocker les informations sur les paramètres de la méthode (utilisables par réflexion)" (voir aussi cette réponse ).

Certains frameworks l'utilisent. Par exemple, spring-mvc a @RequestParam qui par défaut est le nom du paramètre, s'il est résolu. Il prend également en charge la dénomination explicite - @RequestParam("foo") si aucune information de débogage n’est fournie.

44
Bozho

J'ai trouvé une autre solution après avoir marqué cette question comme réponse. La solution est Paranamer .

Exemple:

 Method method = Foo.class.getMethod(...);

 Paranamer paranamer = new CachingParanamer();

 String[] parameterNames = paranamer.lookupParameterNames(method) // throws ParameterNamesNotFoundException if not found

 // or ...

 parameterNames = paranamer.lookupParameterNames(method, false) // will return null if not found
10
Tiago Veloso

Ce n'est pas possible. Les fichiers de classe ne contiennent pas les noms d'arguments, comme vous pouvez le constater avec l'auto-complétion de votre IDE lorsque la source n'est pas disponible.

Par conséquent, l'API de réflexion ne peut pas donner de noms de paramètres.

2
slaphappy

En Java, les noms de paramètres ne sont pas disponibles via réflexion.

2
Leonard Brünings

En plus de this answer: "Les noms de paramètres sont disponibles si vous avez dit au compilateur de les inclure"

Si vous utilisez Eclipse, accédez à projet -> propriétés -> compilateur Java -> cocher "Stockez les informations sur les paramètres de la méthode (utilisables via réflexion).

1
Denis K

Vous pouvez simplement assigner la valeur du paramètre à une autre valeur

Bread slice2;

public void makeSandwich(Bread slice1, Bread slice2, List<Filling> fillings, boolean mustard) {
    this.slice2 = slice2;
    System.out.println(this.slice2.getSomething());
}
0
mastaH

Possédez-vous le code de la méthode? Vous pouvez annoter les paramètres et les noms de passe en tant qu'arguments @Param("slice1"). Plus tard, vous pourrez obtenir l'annotation et en extraire le nom du paramètre.

0
denis.solonenko