cflow le ayuda a aconsejar todo el flujo de control. Vamos a probar 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 (sólo para ver qué pasa):
public class Test {
public static void main(String[] args) {
A.methodA();
}
}
en mi punto de corte se podía vea cflow(call(* B.methodB()))
, entonces quiero flujo de control de aspecto comenzando desde B.methodB
llamando, 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
última cadena no pertenece al aspecto, es sólo por System.out.println
dentro de methodB
. Todos los espectáculos impresos controlan el flujo: cadenas de métodos y 'eventos' (ejecución, llamadas, inicializaciones ...). Verá, comencé desde la clase Test
, que llamó al methodA
pero no están en 'pila', porque estábamos interesados en el flujo de control methodB
.
Si desea obtener esa pila, pero sin la primera línea (que se hace llamar), se podría tratar de definir
public pointcut flow() : cflowbelow(call(* B.methodB())) && !within(CFlow);
cflowbelow es otro punto de corte, lo que significa que el flujo de control excluyendo especificado (en nuestro caso llamando B.methodB
)
Tenga cuidado de agregar !within(_aspect_)
en pointcut, de lo contrario no obtendrá nada bueno excepto StackOverflowError
. Ocurre porque cflow no se puede definir en tiempo de compilación, y en tiempo de ejecución también pertenece al flujo de control (por lo que conduce a recursión eterna ...)
Bueno, piense en el flujo de control como similar a la pila de llamadas, luego obtendrá una idea de su uso;)
Gran respuesta. ¡Muchas gracias por su ayuda! – Joeblackdev
me ayudó también! merece mucho más representante;) – Matthias
¡Muy claro y genial! – ParkCheolu