2009-09-02 5 views
5

Интересно, есть ли способ достичь кода, используя аспект в части «// сделать что-то»?AspectJ Inner-Class Соединительные точки

Заранее спасибо.

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

ответ

7

Вы можете использовать в пределах или withincode срезов в соответствовать содержащий класс, и cflow срез точек в соответствии с выполнением метода addActionListener(), а затем объединить, что с выполнить pointcut для соответствия телу метода actionPerformed().

Например, это срез точек будет соответствовать выполнение метода actionPerformed только в пределах внутреннего класса InnerTest из класса Test (предполагая, что пакет является test) и только в пределах потока выполнения метода addActionListener:

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

Если вас интересует только совпадение вызовов с действиемPerformed() внутри внутреннего класса, вы можете опустить предложение cflow.

Стоит отметить, что если все, что вы заинтересованы в сопрягает выполнение любого метода actionPerformed(), это будет достаточно:

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