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
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étodoPoint
's con un solo parámetroint
.
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.
- 1. ¿Cómo ejecutar automáticamente un método después de la deserialización?
- 2. ¿Debería un método de clase modificadora guardarse o ser llamado explícitamente después de llamar al método?
- 3. método virtual puro Llamado
- 4. Método llamado al despedir a un UIViewController?
- 5. ¿Qué es este tipo de método anulado llamado en Java?
- 6. Ejecutar un método una sola vez al principio antes de ejecutar cualquier prueba en PyUnit
- 7. Método privado llamado error
- 8. Anulando un Método Java
- 9. ¿Cómo ejecuto el código antes y después de un método en una subclase?
- 10. Ejecute un método antes de cada acción en MVC3
- 11. Modificadores del método Perl Moose: Llamar 'alrededor' antes de 'antes' y 'después'
- 12. Recuperando el llamado nombre de método desde dentro de un método
- 13. ¿Existe tal método llamado "getBackgroundColor"?
- 14. ¿Cómo ejecutar un método en un dominio de aplicación separado?
- 15. Enlazando un método existente en Java
- 16. Método WCF llamado dos veces
- 17. @ModelAttribute en un método
- 18. Anulando un método llamado por el constructor de una clase
- 19. ¿Puedo ejecutar un método en mayúsculas en un objeto?
- 20. ¿Tamaño máximo de un método en Java?
- 21. pregunta java: ¿Es un método?
- 22. Creando un método hashCode() - Java
- 23. Cómo ejecutar un método cada X segundos
- 24. ¿Cómo hacer que cada método de clase llame a un método específico antes de la ejecución?
- 25. Pasar los parámetros al método llamado por un NSTimer
- 26. Objeto Python Mock con un método llamado varias veces
- 27. método onClick no llamado en Android
- 28. ¿Es catch un método en java?
- 29. Ejecutar un método antes de todos los métodos de una clase
- 30. método de escritura SessionHandlerInterface no siendo llamado
Pregunta honesta: ¿el consejo de AspectJ todavía se ejecuta cuando se llama al método objetivo a través de Reflection? –
@AlistairIsrael, http://www.eclipse.org/aspectj/doc/released/faq.php#q:reflectiveCalls sugiere que no siempre. –
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