如何配置 aspectj 忽略 getter 和 setter
How to configure aspectj ignore getters and setters
我有一个方面目前可以捕获我的包中的所有 public 方法执行。
我想修改它以排除 setter 和 getter,所以我试过了,这些是我试过的变体:
这个有效,但显然对 setter 或 getter 没有任何作用。
@Around("execution(public * *(..)) && !within(com.walterjwhite.logging..*)")
这不编译:
@Around("execution(public * *(..)) && !within(* set*(..))")
这会编译,但不会阻止捕获 setters/getters:
@Around("execution(public * *(..)) && !execution(* set*(..))")
我也看到了这个 post 作为参考,但那没有用。我在尝试编译方面时遇到编译错误。
第二个无法编译,因为 within()
需要类型签名,而不是方法签名。你指的答案是完全错误的,我不知道为什么它被接受了。我刚刚写了 以更正错误信息。
你最后的尝试基本上是正确的,但只忽略了 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*())
。
- 那些带有名称模式的切入点总是启发式的,所以要小心方法名称,例如
getaway
、settleConflict
、isolate
。他们也会被忽略。
我有一个方面目前可以捕获我的包中的所有 public 方法执行。
我想修改它以排除 setter 和 getter,所以我试过了,这些是我试过的变体:
这个有效,但显然对 setter 或 getter 没有任何作用。
@Around("execution(public * *(..)) && !within(com.walterjwhite.logging..*)")
这不编译:
@Around("execution(public * *(..)) && !within(* set*(..))")
这会编译,但不会阻止捕获 setters/getters:
@Around("execution(public * *(..)) && !execution(* set*(..))")
我也看到了这个 post 作为参考,但那没有用。我在尝试编译方面时遇到编译错误。
第二个无法编译,因为 within()
需要类型签名,而不是方法签名。你指的答案是完全错误的,我不知道为什么它被接受了。我刚刚写了
你最后的尝试基本上是正确的,但只忽略了 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*())
。 - 那些带有名称模式的切入点总是启发式的,所以要小心方法名称,例如
getaway
、settleConflict
、isolate
。他们也会被忽略。