2011-03-05 25 views
27

me he referido a la referencia AspectJ here afirma que el 'cflow' esProgramación orientada a aspectos: ¿qué es 'cflow'?

cflow(Pointcut) - cada unen a punto en el flujo de control de cada unirse punto P recogió por pointcut, incluyendo P sí

Esto no es del todo claro 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 verdad.

Respuesta

45

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

+3

Gran respuesta. ¡Muchas gracias por su ayuda! – Joeblackdev

+1

me ayudó también! merece mucho más representante;) – Matthias

+0

¡Muy claro y genial! – ParkCheolu

Cuestiones relacionadas