我正在尝试组合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());
}
}
我的代码有问题吗?任何帮助表示赞赏。
由于
答案 0 :(得分:0)
您询问代码是否有问题。答案是肯定的。两个切入点setter()
和getter()
是互斥的。因此将它们与&&
组合 - 即创建两个相互分离的连接点集合的交集 - 逻辑上导致空结果集。你的组合切入点不匹配。您应该在他/她的评论中使用||
作为uniknow。
如果您想要实现其他目标,请以可理解的方式解释,必要时通过举例,评论或更新您的问题。我真的没有得到你真正想要的东西。