2011-08-29 723 views
6

consideran este código:¿Cómo obtener el valor de un argumento de método a través de la reflexión en Java?

public void example(String s, int i, @Foo Bar bar) { 
    /* ... */ 
} 

estoy interesado en el valor del argumento anotado con @Foo. Supongamos que ya he descubierto a través de la reflexión (con Method#getParameterAnnotations()) qué parámetro de método tiene la anotación @Foo. (Sé que es el tercer parámetro de la lista de parámetros.)

¿Cómo puedo recuperar el valor de bar para seguir utilizándolo?

+3

No entiendo la pregunta. El valor de 'bar' solo estará disponible durante el tiempo de ejecución. ¿Quieres interceptar llamadas a 'example'? ¿O te refieres al tipo de datos 'Bar'? – home

Respuesta

11

No puede. La reflexión no tiene acceso a las variables locales, incluidos los parámetros del método.

Si desea que la funcionalidad, es necesario para interceptar la llamada al método, que se puede hacer en una de varias maneras:

  • AOP (AspectJ/primavera AOP etc.)
  • proxies (JDK, CGLib, etc.)

En todos estos, usted reuniría los parámetros de la llamada al método y luego le diría a la llamada del método que se ejecutará. Pero no hay forma de llegar a los parámetros del método a través de la reflexión.

Actualización: aquí hay un aspecto de la muestra para que pueda empezar el uso de validación basada en anotación con AspectJ

public aspect ValidationAspect { 

    pointcut serviceMethodCall() : execution(public * com.yourcompany.**.*(..)); 

    Object around(final Object[] args) : serviceMethodCall() && args(args){ 
     Signature signature = thisJoinPointStaticPart.getSignature(); 
     if(signature instanceof MethodSignature){ 
      MethodSignature ms = (MethodSignature) signature; 
      Method method = ms.getMethod(); 
      Annotation[][] parameterAnnotations = 
       method.getParameterAnnotations(); 
      String[] parameterNames = ms.getParameterNames(); 
      for(int i = 0; i < parameterAnnotations.length; i++){ 
       Annotation[] annotations = parameterAnnotations[i]; 
       validateParameter(parameterNames[i], args[i],annotations); 
      } 
     } 
     return proceed(args); 
    } 

    private void validateParameter(String paramName, Object object, 
     Annotation[] annotations){ 

     // validate object against the annotations 
     // throw a RuntimeException if validation fails 
    } 

} 
+0

Ya estoy usando AspectJ, pero no he encontrado una manera de hacerlo. Esta fue la pregunta anterior: http://stackoverflow.com/questions/7228590/how-to-check-if-a-parameter-of-the-current-method-has-an-annotation-and-retrieve – soc

+0

@soc OK, ve mi actualización para empezar, compra [AspectJ en acción] (http://www.manning.com/laddad2/) para aprender realmente cómo hacerlo (o haz preguntas en la [lista de usuarios de AspectJ] (http://www.eclipse.org/aspectj/userlists.php) –

+0

¡Hola, gracias! :-) Ya compré el libro, pero traté de poner todo en las firmas de los partidos, lo cual no funcionó ... – soc

Cuestiones relacionadas