2009-09-02 9 views
5

Je me demande s'il existe un moyen d'atteindre le code en utilisant l'aspect dans la partie "// fait quelque chose"?AspectJ Points de jointure de la classe interne

Merci d'avance.

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

Répondre

7

Vous pouvez utiliser le dans les ou withincode pointcuts pour correspondre à la classe contenant, et la cflow pointcut pour correspondre à l'exécution de la méthode addActionListener(), puis le combiner avec un exécuter pointcut pour correspondre au corps de la méthode actionPerformed().

Par exemple, ce point d'action va correspondre à l'exécution de la méthode actionPerformed que dans le InnerTest de classe interne de l'essai de classe (en supposant que le paquet est test) et que dans le flux d'exécution du procédé de addActionListener:

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

Si vous souhaitez uniquement faire correspondre les appels à actionPerformed() dans la classe interne, vous pouvez omettre la clause cflow.

Il est intéressant de noter que si tout ce que vous êtes intéressé est correspondant à l'exécution de toute méthode actionPerformed(), cela suffirait:

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