web-dev-qa-db-fra.com

Obtenir le Java.lang.reflect.Method à partir d'un ProceedingJoinPoint?

La question est courte et simple: existe-t-il un moyen d'obtenir l'objet Method à partir d'un apsectj ProceedingJoinPoint?

Actuellement je fais

Class[] parameterTypes = new Class[joinPoint.getArgs().length];
Object[] args = joinPoint.getArgs();
for(int i=0; i<args.length; i++) {
    if(args[i] != null) {
        parameterTypes[i] = args[i].getClass();
    }
    else {
        parameterTypes[i] = null;
    }
}

String methodName = joinPoint.getSignature().getName();
Method method = joinPoint.getSignature()
    .getDeclaringType().getMethod(methodName, parameterTypes);

mais je ne pense pas que ce soit la voie à suivre ...

48
Erik

Votre méthode n'est pas fausse, mais il y en a une meilleure. Vous devez convertir en MethodSignature

MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
83
Bozho

Vous devez être prudent car Method method = signature.getMethod() renverra la méthode de l'interface, vous devez l'ajouter pour être sûr d'obtenir la méthode de la classe d'implémentation:

    if (method.getDeclaringClass().isInterface()) {
        try {
            method= jointPoint.getTarget().getClass().getDeclaredMethod(jointPoint.getSignature().getName(),
                    method.getParameterTypes());
        } catch (final SecurityException exception) {
            //...
        } catch (final NoSuchMethodException exception) {
            //...                
        }
    }

(Le code dans catch est volontairement vide, vous feriez mieux d'ajouter du code pour gérer l'exception)

Avec cela, vous aurez l'implémentation si vous souhaitez accéder aux annotations de méthode ou de paramètre si celle-ci n'est pas dans l'interface

42
Nordine