2012-03-07 11 views
8

Estoy tratando de escribir un programa Java de tal manera que después de llamar a un MethodA(), en primer lugar un método llamado methodBeforeA() se llama y luego MethodA () se ejecuta seguido de otro método llamado named, methodAfterA(). Esto es muy similar a lo que hace Junit al usar Annotations (usando @Before, @Test, @ After), así que creo que debería ser posible usar la reflexión, pero no tengo una pista muy buena.Ejecutar un método antes y después de un método llamado en Java

Respuesta

5

AspectJ le permite especificar puntos de corte antes de la entrada del método y después de la salida del método.

http://www.eclipse.org/aspectj/doc/released/progguide/starting-aspectj.html

En AspectJ, puntos de corte a escoger ciertos puntos de unión en el flujo del programa. Por ejemplo, el punto de corte

call(void Point.setX(int)) 

escoge cada unión punto de que es una llamada a un método que tiene la firma vacío Point.setX(int) - es decir, void setX método Point 's con un solo parámetro int.

+0

Pregunta honesta: ¿el consejo de AspectJ todavía se ejecuta cuando se llama al método objetivo a través de Reflection? –

+0

@AlistairIsrael, http://www.eclipse.org/aspectj/doc/released/faq.php#q:reflectiveCalls sugiere que no siempre. –

+0

Gracias por apuntarme en la dirección correcta. Encontré esta publicación de blog y ofrece exactamente lo que estaba buscando. Http://www.mkyong.com/spring3/spring-aop-aspectj-annotation-example/ – Vanp

3

Esto requeriría modificar el código del método para insertar llamadas a los otros métodos. La reflexión de Java te permite hacer muchas cosas, pero no te permite modificar dinámicamente el código de método.

Lo que JUnit hace es diferente. Identifica cada método anotado @Before, @Test y @After, a continuación, hace algo a lo largo de las líneas de:

for (Method t : testMethods) { 
    for (Method b : beforeMethods) 
     b.invoke(); 
    t.invoke(); 
    for (Method a : afterMethods) 
     a.invoke(); 
} 

Por supuesto que puede hacer algo como esto, para asegurarse de que usted llama el "antes" y "después" métodos después cada vez que usted llame al método en cuestión. Pero no puede forzar todos los llamadores para hacer lo mismo.

Cuestiones relacionadas