2009-09-02 5 views
5

Ich frage mich, gibt es eine Möglichkeit, den Code mit Aspekt in "// tun etwas" Teil zu erreichen?AspectJ Inner-Class Join Punkte

Vielen Dank im Voraus.

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

Antwort

7

können Sie verwenden, um den innerhalb oder withincode pointcuts der enthaltenden Klasse entsprechen, und die cflow pointcut die Ausführung des addActionListener() -Methode entsprechen, dann kombinieren, dass mit einem ausführen pointcut, um mit dem body der actionPerformed() -Methode übereinzustimmen.

Zum Beispiel diese pointcut nur die Ausführung der Methode actionPerformed übereinstimmen innerhalb der inneren Klasse InnerTest der Klasse Test (das Paket unter der Annahme test) und nur im Ablauf der Ausführung des addActionListener Methode:

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

Wenn Sie nur an Übereinstimmungen mit Aufrufen von actionPerformed() innerhalb der inneren Klasse interessiert sind, können Sie die cflow-Klausel weglassen.

Es ist erwähnenswert, dass, wenn alle sind Sie interessiert die Ausführung eines actionPerformed() -Methode übereinstimmt, würde dies genügen:

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