2009-09-02 10 views
5

Me pregunto si hay alguna forma de llegar al código usando el aspecto en la parte "// hacer algo".AspectJ Clase interna Unir puntos

Gracias de antemano.

Turan.

public class Test { 
    private class InnerTest { 
     public InnerTest() { 
      JButton j = new JButton("button"); 
      j.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        //do something 
       } 
      }); 
     } 
    } 
} 

Respuesta

7

Puede utilizar el dentro o withincode puntos de corte para que coincida con la clase que contiene, y el punto de corte cflow para que coincida con la ejecución del método addActionListener(), y luego combinar eso con un ejecutar pointcut para unir el cuerpo del método actionPerformed().

Por ejemplo este pointcut coincidirá con la ejecución del método actionPerformed sólo dentro de la InnerTest clase interna de la clase Test (suponiendo que el paquete es test) y sólo dentro del flujo de ejecución del método addActionListener:

pointcut innerTest(): within(test.Test.InnerTest) && 
    cflow(execution(public void javax.swing.JButton.addActionListener(java.awt.event.ActionListener))) && 
    execution(void actionPerformed(ActionEvent)); 

Si solo está interesado en hacer coincidir llamadas a actionPerformed() dentro de la clase interna puede omitir la cláusula cflow.

Vale la pena señalar que si todo lo que les interesa es que concuerden con la ejecución de cualquier método actionPerformed(), esto sería suficiente:

pointcut innerTest(): 
    execution(void java.awt.event.ActionListener+.actionPerformed(ActionEvent));