web-dev-qa-db-fra.com

Spring 4 Join point pour obtenir les noms et les valeurs des arguments de méthode

J'utilise Spring 4.3. Est-il possible d'obtenir des noms et des valeurs de paramètres de méthode qui lui sont transmis? Je crois que cela peut être fait en utilisant AOP (avant conseil) si possible, veuillez me donner un code source.

11
Debopam

Les éléments suivants fonctionnent comme prévu (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();
    }
}
11
snorbi
CodeSignature methodSignature = (CodedSignature) joinPoint.getSignature();
String[] sigParamNames = codeSignature.getParameterNames(); 

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

5
sundar.sat84

Malheureusement, vous ne pouvez pas faire ça. 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.

Pour contourner ce problème, vous pouvez ajouter des annotations supplémentaires telles que @ParamName(name = "paramName").

Ainsi, vous pouvez obtenir les noms des paramètres de la manière suivante:

MethodSignature.getMethod().getParameterAnnotations()

METTRE À JOUR

Depuis Java 8 vous pouvez le faire

Vous pouvez obtenir les noms des paramètres formels de n'importe quelle 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. Cela est dû au fait que de nombreux outils qui produisent et consomment des fichiers de classe peuvent ne pas s’attendre à l’encombrement statique et dynamique plus important 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. De plus, 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 stocker des noms de paramètres formels dans un fichier .class particulier, et ainsi permettre à l'API Reflection de récupérer des noms de paramètres formels, compilez le fichier source avec l'option -parameters dans le compilateur javac.

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

0
Mykola Yashchenko

Dans vos conseils AOP, vous pouvez utiliser les méthodes de JoinPoint pour accéder aux méthodes et à leurs paramètres. Il existe plusieurs exemples en ligne et sur stackoverflow.

Obtenir des arguments de méthode en utilisant 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
Reenactor Rob