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 ...
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();
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