2009-09-02 13 views
5

Zastanawiam się, czy istnieje sposób, aby osiągnąć kod przy użyciu aspektu w części "// zrobić coś"?AspectJ Inner-Class Łączenie punktów

Z góry dziękuję.

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

Odpowiedz

7

Można użyć w ciągu lub withincode punktów przekroju dopasować zawierającego klasę, a Cflow punktu przekroju dopasować wykonanie metody addActionListener(), a następnie połączyć to z wykonać pointcut, aby dopasować treść metody actionPerformed().

Przykładowo ten punkt przekroju pasuje realizacji sposobu actionPerformed tylko w wewnętrznym klasy InnerTest testowego klasy (przy założeniu, że pakiet jest test) i tylko w strumieniu realizacji sposobu addActionListener:

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

Jeśli interesuje Cię tylko dopasowywanie wywołań do actionPerformed() wewnątrz klasy wewnętrznej, możesz pominąć klauzulę przepływu.

Warto zauważyć, że jeśli wszystko jesteś zainteresowany jest dopasowanie wykonanie dowolnej metody actionPerformed(), byłoby to wystarczyć:

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