2011-04-19 9 views
34

La pregunta es breve y simple: ¿Hay alguna manera de obtener el objeto Método de un apsectj ProceedingJoinPoint?Obteniendo java.lang.reflect.Method de un ProceedingJoinPoint?

Actualmente estoy haciendo

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

pero no creo que este es el camino a seguir ...

Respuesta

68

Su método no está mal, pero no hay una mejor. Usted tiene que echar a MethodSignature

MethodSignature signature = (MethodSignature) joinPoint.getSignature(); 
Method method = signature.getMethod(); 
+0

Cuando se utiliza en la aplicación de arranque de primavera, el molde anterior falla. La firma es entonces del tipo MethodSignatureImpl que es una clase interna privada de resortes MethodInvocationProceedingJoinPoint. – Heri

+6

Actualice el comentario anterior (que es incorrecto): en mi prueba importé la clase MethodSignature incorrecta que dio lugar a una ClassCastException. La clase correcta es org.aspectj.lang.reflect.MethodSignature. – Heri

36

Usted debe tener cuidado porque Method method = signature.getMethod() devolverá el método de la interfaz, se debe agregar que se trata de seguro de obtener el método de la clase de implementación:

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

(El código en captura es voluntario vacío, es mejor agregar código para administrar la excepción)

Con esto tendrá la implementación si desea acceder a las anotaciones de métodos o parámetros si esta no está en la interfaz

+0

Te hubiera votado dos veces si pudiera, una vez por la gran respuesta, y una por 'punto común ' – Taylor

Cuestiones relacionadas