组合多个切入点AspectJ返回adviceDidNotMatch警告

时间:2016-05-31 09:40:41

标签: java aop aspectj

我正在尝试组合getter和setter的多个切入点来创建一个在两个切入点都被执行时执行的建议。我已经尝试了正常的AspectJ类和注释@Aspect类,但它仍然给我警告adviceDidNotMatch,最终没有执行建议。奇怪的是,如果我改变&& (AND)与|| (或)它有效,但为什么&&什么都不起作用?

这是在普通的AspectJ类中声明的建议。

package testMaven;

pointcut getter() : execution(* testMaven.testing.getDd(..));
before() : getter(){
    System.out.println("test get");
}

pointcut setter() : execution(* testMaven.testing.setDd(..));
before() : setter(){
    System.out.println("test set");
}

pointcut combine(): getter() && setter();

before(): combine(){
    System.out.println("testing combine");
}
}

以下是注释@Aspect类

中声明的建议
package testMaven;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.Before;


@Aspect
public class aspecter {

    @Pointcut("call (*  testMaven.testing.getDd(..))")
    public void getter(){

    }

    @Pointcut("call (*  testMaven.testing.setDd(..))")
    public void setter(){}


    @Pointcut("execution (*  testMaven.tester.setZ(..))")
    public void setterZ(){}

    @Before("setterZ()")
    public void settingZ(){
        System.out.println("before set Z");
    }

    @Pointcut("getter() && setter()")
    public void getterSetter(){}

    @After("getterSetter()")
    public void testerd(){
        System.out.println("works");
    }

    @Pointcut("getter() && setterZ()")
    public void getterSetter2(){}

    @After("getterSetter2()")
    public void testinger(){
        System.out.println("ok");
    }

}

这是我想要建议的测试类:

package testMaven;

public class testing {

    public int dd;

    public int getDd() {
        return dd;
    }

    public void setDd(int dd) {
        this.dd = dd;
    }
}


package testMaven;

public class testing {

    public int dd;


    public int getDd() {
        return dd;
    }


    public void setDd(int dd) {
        this.dd = dd;
    }


    public void aa(int a){
        System.out.println(a);
    }
}

以下是主要课程:

package testMaven;

public class MainApp {

public static void main(String[] args) {
        // TODO Auto-generated method stub

        testing test = new testing();
        test.aa(2);
        test.setDd(3);
        tester et = new tester();
        et.setZ(3);
        et.printNo(1000);
        System.out.println(test.getDd());



    }

}

我的代码有问题吗?任何帮助表示赞赏。

由于

1 个答案:

答案 0 :(得分:0)

您询问代码是否有问题。答案是肯定的。两个切入点setter()getter()是互斥的。因此将它们与&&组合 - 即创建两个相互分离的连接点集合的交集 - 逻辑上导致空结果集。你的组合切入点不匹配。您应该在他/她的评论中使用||作为uniknow。

如果您想要实现其他目标,请以可理解的方式解释,必要时通过举例,评论或更新您的问题。我真的没有得到你真正想要的东西。