0

我正在尝试使用 AspectJ(不是 spring)将观察者模式实现到我的程序中,并且我尝试编写添加观察者方法,但编译器似乎在抱怨

after(Subject employee, Observer handler): execution(com.company.domain.EmployeeController.registerTo(*))&& this(handler)&& args(employee){
        employee.addObserver(handler);
    }

它抱怨的燕麦是this:execution(com.company.domain.EmployeeController.registerTo(*))

错误是:

[ERROR] Failed to execute goal org.codehaus.mojo:aspectj-maven-plugin:1.10:compile (default) on project SpaceX: AJC compiler errors:
[ERROR] error at after(Subject employee, Observer handler): execution(com.company.domain.EmployeeController.registerTo(*))&& this(handler)&& args(conc){
[ERROR] 
[ERROR] D:\Projects2016\SpaceX\src\main\java\aspects\SpacexObserver.aj:12:0::0 Syntax error on token ")", "(" expected
[ERROR] -> [Help 1]

它所期待的对我来说毫无意义。我将该声明分成不同的行,这就是我看到它在第二次结束时抱怨的方式,(com.company.domain.EmployeeController.registerTo(*)--->)<---这就是括号。我不知道为什么它在抱怨

我尝试更改 aspectj 版本,但这无济于事。将参数更改为除 * 之外的任何其他参数只会使其抛出不同的版本,因此我无法弄清楚为什么它不喜欢它。

删除方法并尝试运行方面是行不通的,因为这样整个事情就没有意义了,我也不知道如何调试它。

我还没有弄清楚发生了什么。我将在这里发布整个方面,也许几天后人们可以找出原因,我仍然无法找出为什么我的程序在考虑所有方面都拒绝工作。

public privileged aspect SpacexObserver extends AbstractObserver{
    protected pointcut observed(Subject o):execution(* com.company.domain.EmployeeController.createDesign(..)) && target(o);

    //adding an observer
    after(Subject employee, Observer handler): execution(com.company.domain.EmployeeController.registerTo(*))&& this(handler)&& args(employee){
        employee.addObserver(handler);
        System.out.println("wer");
    }

    //removing an observer
//    after(ViewResultsHandler handler):execution(* ViewResultsHandler.close())&& target(handler){
//        Employee con=handler.concurs;
//        con.removeObserver(handler);
//
//    }

    //observer action
    public void Employee.update(Object o){
        System.out.println("call loadParticipants");
    }
}

对于 AbstractObserver 部分,我有这个:

    protected interface Subject{
        void addObserver(Observer o);
//        void removeObserver(Observer o);
        void notifyObservers(Object newData);

    }

    protected interface Observer{
        void update(Object newData);
    }

    private Set<Observer> Subject.observers=new HashSet<Observer>();
    public void Subject.addObserver(Observer o){
        System.out.println("Adding observer");
        observers.add(o);
    }
    public void Subject.removeObserver(Observer o){
        System.out.println("Removing observer");
        observers.remove(o);
    }
    public void Subject.notifyObservers(Object newData){
        for(Observer obs:observers){
            obs.update(newData);
        }
    }

    protected abstract pointcut observed(Subject o);

    after (Subject o) returning:observed(o){
        o.notifyObservers(null);
    }
}

我相信在这里after(Subject employee, Observer handler)我应该使用实际实现主题/观察者的类,但方面拒绝这样看待它们(它没有看到它们实现的方法)所以我不知道它是否对 findign 有任何影响otu 为什么我有这个问题。正如我所听说的,观察者模式只能使用 aspectj 来实现,这就是我使用的。错误没有意义

4

0 回答 0