如何配置aspectj ignore getters和setter

时间:2018-01-20 16:51:00

标签: java aop aspectj

我有一个方面目前可以捕获我的包中的所有公共方法执行。

我想修改它以排除setter和getter,所以我试过了,这些是我尝试的变种:

这个有效,但显然不会对制定者或吸气者做任何事情。

@Around("execution(public * *(..)) && !within(com.walterjwhite.logging..*)")

这不编译:

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

这可以编译,但不会阻止捕获setter / getter:

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

我也发现这篇文章作为参考,但这并没有奏效。尝试编译方面时出现编译错误。

How can I exclude getters and setters in aspectJ?

1 个答案:

答案 0 :(得分:1)

第二个不编译,因为within()需要类型签名,而不是方法签名。你所指的答案是完全错误的,我不知道为什么它被接受了。我刚写了a new one来纠正这些虚假信息。

你的最后一次尝试基本上是正确的,但只是忽略了setter,而不是getter。试试这个:

驱动程序应用程序:

package de.scrum_master.app;

public class Application {
  private int id;
  private String name;

  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public void doSomething() {
    System.out.println("Doing something");
  }

  public static void main(String[] args) {
    Application application = new Application();
    application.setId(11);
    application.setName("John Doe");
    application.doSomething();
    System.out.println(application.getId() + " - " + application.getName());
  }
}

<强>方面:

package de.scrum_master.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class MyAspect {
  @Around("execution(public * *(..)) && !execution(void set*(*)) && !execution(!void get*())")
  public Object myAdvice(ProceedingJoinPoint thisJoinPoint) throws Throwable {
    System.out.println(thisJoinPoint);
    return thisJoinPoint.proceed();
  }
}

控制台日志:

execution(void de.scrum_master.app.Application.main(String[]))
execution(void de.scrum_master.app.Application.doSomething())
Doing something
11 - John Doe

请注意

  • 如果你有像isActive()这样的布尔值的getter并且也想忽略它们,你必须通过&& !execution(boolean is*())扩展切入点。
  • 具有名称模式的那些切入点始终只是启发式,因此请注意方法名称,例如getawaysettleConflictisolate。它们也会被忽略。