我有很多類覆蓋equals來進行對象比較。對於每個equals實現,它使用區分大小寫的String .equals。我想知道是否可以使用AspectJ在每種方法中用.equalsIgnoreCase替換.equals?使用AspectJ註解方法實現的一部分
或者,如果上述情況是不可能的,我們可以使用AspectJ攔截類以使用我自己的String .equals實現嗎? (不改變方法實現)
我有很多類覆蓋equals來進行對象比較。對於每個equals實現,它使用區分大小寫的String .equals。我想知道是否可以使用AspectJ在每種方法中用.equalsIgnoreCase替換.equals?使用AspectJ註解方法實現的一部分
或者,如果上述情況是不可能的,我們可以使用AspectJ攔截類以使用我自己的String .equals實現嗎? (不改變方法實現)
你希望String.equals(Object anObject)方法被重新路由到equalsIgnoreCase(String),因爲它在你的包中的每次出現都是正確的?
切入點它需要攔截的equals你的包(within(your.packages.*)
)內的呼叫(call(boolean equals(Object))
),並提供兩個目標(target(sourceString)
)和參數(args(compareString)
),所以它應該是這樣的:
@Pointcut("call(boolean equals(Object)) && args(compareString) && target(sourceString) && within(your.packages.*)")
protected void equalsPointcut(final Object compareString, final String sourceString) {}
使用切入點將不得不環視意見,跳過調用equals和做它自己的電話,而不是給equalsIgnoreCase建議:
@Around("equalsPointcut(compareString, sourceString)")
public Object around(final ProceedingJoinPoint joinPoint, final Object compareString, final String sourceString)
throws Throwable {
System.out.println("Aspect!");
return sourceString.equalsIgnoreCase(compareString != null ? compareString.toString() : null);
}
的系統輸出只有個可以檢查該方面是否實際使用,當然應該在實際使用情況下刪除。
我的測試是這樣的:
public static void main(final String[] args) {
String a = "Blaaaa";
String b = "BLAAAA";
System.out.println(a.equals(b));
Object c = new Object();
System.out.println(c.equals(b));
}
而且它產生的輸出:
Aspect!
true
false
注意a.equals(B)被重新路由到equalsIgnoreCase(因爲它的目標是一個字符串) ,但c.equals(b)不是(因爲它的目標是一個Object!)。
我希望這能回答你的問題。快樂的編碼! ;)
看起來沒有調用Aspect。我應該修改我的Spring配置文件中的任何內容嗎?使用cxf – enfany
調用在Spring中不受支持AspectJ – enfany
是的,這方面在Spring AOP中不起作用。既然你從未提到過Spring,我認爲你使用的是AspectJ。 ;)沒有call-Pointcut,你可能會在這種情況下運氣不好。 java.lang.String.equals位於代碼之外,不能通過執行Pointcut提供建議 - 這就是我使用call的原因。到目前爲止,我看不到只用Spring AOP做你想做的事。 – sheltem