2013-08-27 25 views
0

我有很多類覆蓋equals來進行對象比較。對於每個equals實現,它使用區分大小寫的String .equals。我想知道是否可以使用AspectJ在每種方法中用.equalsIgnoreCase替換.equals?使用AspectJ註解方法實現的一部分

或者,如果上述情況是不可能的,我們可以使用AspectJ攔截類以使用我自己的String .equals實現嗎? (不改變方法實現)

回答

1

你希望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!)。

我希望這能回答你的問題。快樂的編碼! ;)

+0

看起來沒有調用Aspect。我應該修改我的Spring配置文件中的任何內容嗎?使用cxf – enfany

+0

調用在Spring中不受支持AspectJ – enfany

+0

是的,這方面在Spring AOP中不起作用。既然你從未提到過Spring,我認爲你使用的是AspectJ。 ;)沒有call-Pointcut,你可能會在這種情況下運氣不好。 java.lang.String.equals位於代碼之外,不能通過執行Pointcut提供建議 - 這就是我使用call的原因。到目前爲止,我看不到只用Spring AOP做你想做的事。 – sheltem

相關問題