5

「//何かをする」部分でアスペクトを使用してコードに到達する方法はあるのだろうか?

前もって感謝します。

トゥラン。

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

1 に答える 1

7

withinまたはwithincodeポイントカットを使用して含まれているクラスと一致させ、cflowポイントカットを addActionListener() メソッドの実行と一致させてから、それを実行ポイントカットと組み合わせてactionPerformed() メソッドの本体と一致させることができます。

たとえば、このポイントカットは、クラス Test の内部クラス InnerTest (パッケージが であると仮定test)内およびaddActionListener メソッドの実行フロー内でのみ actionPerformed メソッドの実行と一致します。

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

内部クラス内の actionPerformed() への呼び出しの一致のみに関心がある場合は、cflow 句を省略できます。

actionPerformed() メソッドの実行に一致することだけに関心がある場合は、これで十分であることに注意してください。

pointcut innerTest(): 
    execution(void java.awt.event.ActionListener+.actionPerformed(ActionEvent));
于 2009-09-06T17:04:30.290 に答える