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?
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.
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
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.
En Java, les noms de paramètres ne sont pas disponibles via réflexion.
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).
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());
}
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.