我正在使用 Aspectj 执行项目范围的策略。
我现在要实现的一件事是,除了使用 Guava 的Preconditions.check*
方法进行简单验证之外,任何 setter 方法中都不应该有任何逻辑。
public pointcut withinSetter() :
withincode(public void set*(*));
public pointcut inputValidation() :
call(public void Preconditions.check*(*));
public pointcut setFieldValue() : set(* *);
public pointcut entity() : within(com.mycompany.BaseEntity+);
declare warning :
entity() && withinSetter() && !setFieldValue() && !inputValidation():
"Please don't use Logic in Setters";
这按预期工作,为任何非 setter 代码生成警告。但是,对于这样的构造,它会失败:
public void setFoo(final String newFoo) {
Preconditions.checkNotNull(newFoo); // this is OK
Preconditions.checkArgument(
newFoo.matches("\\p{Alpha}{3}"), // this generates a warning
// because String.matches()
// is called
"Foo must have exactly 3 characters!");
this.foo = newFoo;
}
所以我正在寻找的是一个允许任何代码的构造,只要它发生在Preconditions.check*
调用的参数中。有这样的切入点吗?