我正在使用Aspectj進行項目範圍的策略執行。關於使用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";
這可以按預期工作,爲任何非設置代碼生成警告。但是,它未能對這樣的結構:
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*
電話。有沒有這樣的切入點?
我不認爲你可以。即使你可以,有人可以在「Preconditions」調用中潛入一個改變狀態的呼叫。白名單允許的方法是什麼?那裏有很多嗎? – Rom1 2011-04-27 14:02:13
@ Rom1偷偷摸摸:我意識到這一點,但願意承擔風險。我正在反對壞習慣,而不是反對邪惡的黑客。白名單:這就是我目前正在做的事情。問題是這是一個有很多不同編碼風格的大項目:-) – 2011-04-27 14:21:02