tutorial programming programacion paradigma oriented orientado orientada example caracteristicas aspectos java aop aspectj

java - programming - programacion orientada a aspectos pdf



Programación orientada a aspectos: ¿qué es ''cflow''? (1)

Me he referido a la referencia de AspectJ here que indica que el ''cflow'' es

cflow(Pointcut) : cada punto de unión en el flujo de control de cada punto de unión P seleccionado por Pointcut, incluido P mismo

Esto no es totalmente lúcido para mí y me preguntaba si alguien podría elaborar un poco más sobre el significado de cflow, por favor. ¿Por qué usarlo?

Gracias de hecho.


cflow te ayuda a aconsejar todo el flujo de control. Probemos un ejemplo, tengo 4 clases pequeñas.

public class A { public static void methodA() { B.methodB(); } } public class B { public static void methodB() { C.methodC(); int a = 1; int b = 2; System.out.println( a + b ); } } public class C { public static void methodC() { D.methodD(); } } public class D { public static void methodD() { } }

mi aspecto:

public aspect CFlow { public pointcut flow() : cflow(call( * B.methodB() ) ) && !within(CFlow); before() : flow() { System.out.println( thisJoinPoint ); } }

y mi corredor (solo para ver que pasa):

public class Test { public static void main(String[] args) { A.methodA(); } }

en mi corte de puntos, podría ver cflow(call( * B.methodB() ) ) , así que quiero ver el flujo de control a partir de B.methodB llamadas a B.methodB , y cuando ejecuta la clase de Prueba que ve en la consola:

call(void test.B.methodB()) staticinitialization(test.B.<clinit>) execution(void test.B.methodB()) call(void test.C.methodC()) staticinitialization(test.C.<clinit>) execution(void test.C.methodC()) call(void test.D.methodD()) staticinitialization(test.D.<clinit>) execution(void test.D.methodD()) get(PrintStream java.lang.System.out) call(void java.io.PrintStream.println(int)) 3

La última cadena no pertenece al aspecto, es solo debido a System.out.println dentro de methodB . Todo lo impreso muestra que usted controla las cadenas de flujo de métodos y ''eventos'' (ejecución, llamadas, inicializaciones ...). Verá, comencé desde la clase Test , que se llama methodA pero no están en "stack", porque estábamos interesados ​​en el flujo de control de methodB .

Si desea obtener esa pila, pero sin la primera línea (llamándose a sí mismo), podría intentar definir

public pointcut flow() : cflowbelow(call( * B.methodB() ) ) && !within(CFlow);

cflowbelow es otro corte de puntos, lo que significa que el flujo de control se excluye especificado (en nuestro caso, se llama B.methodB ).

Tenga cuidado de agregar !within(_aspect_) en el corte de puntos, de lo contrario no obtendrá nada bueno, pero Error . Ocurre porque cflow no se puede definir en tiempo de compilación, y el aspecto en tiempo de ejecución también pertenece al flujo de control (lo que lleva a la recursión eterna ...)

bueno, piense en el flujo de control como similar a la pila de llamadas, luego tendrá una idea de su uso;)