我想記錄來自類的列表(可能屬於不同的包)的所有方法。請注意,這些方法只能屬於指定的類。AspectJ切入點類的列表中的所有方法
我試過以下,但是這些不工作
(1)如果使用()切入點 在這裏,我得到一個錯誤的切入點和AOP的
"incompatible number of arguments to pointcut, expected 1 found 0"
@Pointcut("execution(*.*(..)) && if()")
public static boolean mycut(JoinPoint jp) {
boolean matches = ... ;//Test using jp if the declaring class belongs to the list
return matches;
}
(2)使用組合。 XML 在這裏,我得到一個錯誤
java.lang.NoSuchMethodError:
com.mypackage.TraceAspect.aspectOf()Lcom/df/jc/aspect/TraceAspect;
//in com.mypackage.TraceAspect aspect class
@Pointcut("execution(*.*(..)) && !within(com.mypackage.TraceAspect)")
public void mycut(){
}
//in aop.xml
<weaver>
<include within="package1.Class1">
<include within="package2.Class2">
<include within="package3.Class3">
</weaver>
這是怎麼回事錯在這裏?
它當然可以通過在切入點中單獨指定每個類來完成,但是這對於數百個類是不可縮放的。理想情況下,如果可以從外部文本文件中拾取類別列表(爲便於配置),這將是非常好的(爲了便於配置)
找到了這個解決方案,但它仍然能夠從aop.xml以外的外部文件中獲取所需的類。http://stackoverflow.com/questions/18130336/read-aspectj-pointcut-definition -from-property-file-for-ltw – user3613747
爲什麼? aop.xml不夠外部?順便說一句,如果你有數百個類,他們中的很多應該有一些共同之處:類名前綴/後綴,包名稱,實現的接口,標記註釋。有許多方法可以重構代碼,以便更容易地表達簡短的切入點,而不是維護容易出錯且通常過時的列表,其中包含數百個條目。 AOP並不意味着要修補糟糕的應用程序設計。恕我直言,你希望這樣做的方式是一個症狀,而不是問題的根源。 – kriegaex
這是一個基於現實世界的要求 - 並非所有的代碼都是很好的代碼:\t 1)源代碼中有許多軟件包(我想要的方面)與一些其他專有Jars中的軟件包重疊我不想在這方面)。 2)代碼是遺留的,寫了很多年,有很多用戶 - 所以重構是沒有問題的 3)有人可能會爭論編寫一個預處理器,將類列表轉換爲aop.xml,但是這會引入兩個額外的步驟 - a)運行預處理器b)將aop.xml放在正確的類路徑中 4)只需在最後尋找一個簡單的解決方案 – user3613747