2017-06-19 1 views

Répondre

0

Malheureusement, vous ne pouvez pas le faire. C'est une limitation bien connue du bytecode - les noms d'arguments ne peuvent pas être obtenus en utilisant la réflexion, car ils ne sont pas toujours stockés dans le bytecode.

Comme solution de contournement, vous pouvez ajouter des annotations supplémentaires comme @ParamName(name = "paramName").

Ainsi, vous pouvez obtenir les noms params de la manière suivante:

MethodSignature.getMethod().getParameterAnnotations() 

MISE À JOUR

Depuis Java 8, vous pouvez le faire

Vous pouvez obtenir les noms des formelle paramètres de toute méthode ou constructeur avec la méthode java.lang.reflect.Executable.getParameters. (Les classes Method et Constructor étendent la classe Executable et héritent donc de la méthode Executable.getParameters.) Cependant, les fichiers .class ne stockent pas les noms de paramètres formels par défaut. En effet, de nombreux outils qui produisent et consomment des fichiers de classe ne peuvent pas s'attendre à l'empreinte statique et dynamique plus importante des fichiers .class contenant des noms de paramètres. En particulier, ces outils devraient gérer des fichiers .class plus volumineux, et la machine virtuelle Java (JVM) utiliserait plus de mémoire. En outre, certains noms de paramètres, tels que secret ou mot de passe, peuvent exposer des informations sur les méthodes sensibles à la sécurité.

Pour mémoriser les noms de paramètres formels dans un fichier .class particulier, et ainsi permettent à l'API de réflexion pour récupérer les noms de paramètres formels, la compilation le fichier source avec l'option -Paramètres au compilateur javac.

https://docs.oracle.com/javase/tutorial/reflect/member/methodparameterreflection.html

+0

Ceci est possible. Voir ma réponse sur cette page. –

-1

Dans vos conseils AOP vous pouvez utiliser des méthodes de la JoinPoint pour avoir accès aux méthodes et leurs paramètres. Il y a plusieurs exemples en ligne et à stackoverflow.

Get method arguments using spring aop?

Pour obtenir des arguments: https://docs.jboss.org/jbossaop/docs/2.0.0.GA/docs/aspect-framework/apidocs/org/jboss/aop/joinpoint/MethodInvocation.html#getArguments()

Pour obtenir les détails de la méthode: https://docs.jboss.org/jbossaop/docs/2.0.0.GA/docs/aspect-framework/apidocs/org/jboss/aop/joinpoint/MethodInvocation.html#getMethod%28%29

+0

Bien sûr, vous pouvez obtenir tous les arguments, mais vous ne pouvez pas obtenir les noms des arguments, c'est impossible –

+0

https://stackoverflow.com/questions/5720494/aspectj-joinpoint-question La première réponse fournit des exemples de code pour récupérer les noms et les valeurs des paramètres. Cela nécessite d'utiliser AspectJ. –

0
CodeSignature methodSignature = (CodedSignature) joinPoint.getSignature(); 
String[] sigParamNames = codeSignature.getParameterNames(); 

Vous pouvez obtenir les noms des arguments de signature de la méthode.

0

Les travaux suivants attendus (Java 8 + Spring 5.0.4 + AspectJ 1.8.13):

@Aspect 
@Component 
public class SomeAspect { 

    @Around("@annotation(SomeAnnotation)") 
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable { 
     CodeSignature codeSignature = (CodeSignature) joinPoint.getSignature(); 

     System.out.println("First parameter's name: " + codeSignature.getParameterNames()[0]); 
     System.out.println("First argument's value: " + joinPoint.getArgs()[0]); 

     return joinPoint.proceed(); 
    } 
}