如何在aspectJ中排除getter和setter?

时间:2015-02-03 10:52:21

标签: java aspectj aop

我在我的maven项目中有一个class aspectJ,让我在项目中显示任何被调用方法的Begin和End。 我现在尝试排除所有的getter和setter。 我尝试修改此注释:  @Around("execution(public * *(..)) 通过  @Around("execution(public * *(..) && !within(* set*(..))")

但它并没有鞭打,而且它给了我这一点:

 [ERROR] Failed to execute goal org.codehaus.mojo:aspectj-maven-plugin:1.7:compile (default) on project spb-lceb: AJC compiler errors:
 [ERROR] error at @Around("execution(public * *(..) && !within(* set*(..))")
 Syntax error on token "execution(public * *(..) && !within(* set*(..))", ")" expected

任何想法

3 个答案:

答案 0 :(得分:2)

我认为这只是一个错字,因为你在)运算符之前的执行调用结束时有一个mising &&

@Around("execution(public * *(..) && !within(* set*(..))")

应该是:

@Around("execution(public * *(..)) && !within(* set*(..))")

尝试一下,应该这样做。

对于以获取开头的方法,最佳解决方案是重命名它们以消除此冲突。

答案 1 :(得分:1)

接受的解决方案显然是错误的,因为within(* set*(..))甚至不会编译。此切入点类型需要类型签名,而不是方法签名。此外,它只是试图照顾制定者,而不是OP所要求的吸气剂。

正确的解决方案是:

@Around("execution(public * *(..)) && !execution(* set*(..)) && !execution(* get*(..))")

通过接受错误的解决方案,OP甚至激怒了其他人尝试here。这就是为什么经过这么长时间我都在写这个答案。

答案 2 :(得分:0)

//package name to exclude
@Pointcut("execution(* com.aasif.dao.*.*(..))")
private void forDaoPackage() {}

//getter
@Pointcut("execution(* com.aasif.dao.*.get*(..))")
private void getter() {}

//setter
@Pointcut("execution(* com.aasif.dao.*.set*(..))")
private void setter() {}

//excluding getter and setter  method 
@Pointcut("forDaoPackage() && !(getter() || setter())")
private void forNoGetterSetter() {}


//applying to advice
@Before("forNoGetterSetter()")
public void excludingGetter() {
    System.out.println("performCloud()");
    }