Как выбрать между Call и Execution с помощью поля со списком в AspectJ - PullRequest
0 голосов
/ 29 марта 2012

Я в настоящее время внедряю регистратор с использованием aspectj. Теперь я хочу иметь графический интерфейс, из которого я могу выбрать, какой из них выбрать: вызов или выполнение. На основании выбора АОП будет работать и регистрировать информацию.

Возможно ли этого добиться? Кто-нибудь может мне помочь с этим?

1 Ответ

0 голосов
/ 03 мая 2012

Вы можете использовать if() в определении pointcut.

Я создал новый проект AspectJ в Eclipse со следующей структурой пакета:

Package structure

MyAspect.aj имеет следующий код:

package aspectj;

@Aspect
public class MyAspect {

    public static boolean call = true;
    public static boolean exec = true;

    @Pointcut("if() && call(* *.*(..)) && !within(aspectj..*)")
    public static boolean callPointcut(JoinPoint jp) {
        return call;
    }

    @Pointcut("if() && execution(* *.*(..)) && !within(aspectj..*)")
    public static boolean execPointcut(JoinPoint jp) {
        return exec;
    }

    @After("execPointcut(jp) || callPointcut(jp)")
    public void advice(JoinPoint jp){
        System.out.println(jp);
        }
}

И GUI.java:

package main;

public class GUI {

    private JFrame frame;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    GUI window = new GUI();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public GUI() {
        initialize();
    }

    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 328, 109);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        final JCheckBox chckbxCall = new JCheckBox("Call");
        chckbxCall.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                 MyAspect.call = chckbxCall.isSelected();
            }
        });
        chckbxCall.setSelected(true);
        chckbxCall.setBounds(6, 6, 128, 23);
        frame.getContentPane().add(chckbxCall);

        final JCheckBox chckbxExecution = new JCheckBox("Execution");
        chckbxExecution.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                 MyAspect.exec = chckbxExecution.isSelected();
            }
        });
        chckbxExecution.setSelected(true);
        chckbxExecution.setBounds(6, 41, 128, 23);
        frame.getContentPane().add(chckbxExecution);

        JButton btnTestbutton = new JButton("testButton");
        btnTestbutton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("button pressed");
            }
        });
        btnTestbutton.setBounds(172, 5, 117, 29);
        frame.getContentPane().add(btnTestbutton);
    }
}

Надеюсь, что это поможет в качестве доказательства концепции.

...