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