2013-08-30 90 views
0

我在某個附件中切入了String .hashCode。我想將target(String)更改爲大寫,然後繼續調用原始的hashCode。我不知道如何做到這一點,下面的代碼不能正常工作。AspectJ:在建議中更改目標

@Pointcut("call(int hashCode(..)) && target(sourceString) && within(com.sample.package..*)") 
public void hashCodePointcut(final String sourceString) {} 


@Around("hashCodePointcut(sourceString)") 
public Object around(final ProceedingJoinPoint joinPoint, String sourceString) 
     throws Throwable { 
    System.out.println("<<<<<<<<<<<<<<<<<Invoking hashCode on "+joinPoint.getSourceLocation().getFileName()); 
    System.out.println("<<<<<<<<<<<<<<<<<Target String: "+ sourceString); 
    sourceString = sourceString.toUpperCase(); 
    return joinPoint.proceed(); 

} 

回答

0

讓我說,我用這個建議強烈反對前言這個答案。國際海事組織(IMO)一旦在事實發生之後開始使用哈希方法並使結果不那麼獨特(忽略字符串中的大小寫等),您將在未來的問題中深入探究,並堅定地走在編碼的黑暗面。隨着中說足夠強烈,這裏就是我會做它:

@Pointcut("call(int java.lang.String.hashCode(..)) && target(sourceString) && within(com.sample.packages..*) && !within(your.package.AspectClass)") 
public void hashCodePointcut(final String sourceString) {} 


@Around("hashCodePointcut(sourceString)") 
public Object around(final ProceedingJoinPoint joinPoint, String sourceString) 
    throws Throwable { 
    System.out.println("<<<<<<<<<<<<<<<<<Invoking hashCode on"+joinPoint.getSourceLocation().getFileName()); 
    System.out.println("<<<<<<<<<<<<<<<<<Target String: "+ sourceString); 
    sourceString = sourceString.toUpperCase(); 
    return sourceString.hashCode(); 

}

我沒有試過呢,但它應該重新路由所有呼叫到String.hashCode()方法在該String的.toUpperCase()上調用相同的方法。它必須這樣做,因爲你不能改變joinPoint的目標(這就是爲什麼你的建議可能不會如此)。

增設了「!內(your.package.AspectClass)」的切入點,以防止在一個無限循環的方面內通話可以應用同樣的建議。

讓我知道如果這能幫助,或者如果還是有一些事情錯了(除了事實,你用的hashCode(瞎);))。

+0

謝謝sheltem。一個簡單的問題,有時.hashCode在Java集合中隱式調用,即HashTable,只是攔截對.hashCode的調用在這種情況下不起作用...任何推薦? – enfany

+0

您可以嘗試刪除「within(your.package.here)」 - 切入點的一部分,因此也建議在該切入點之外的呼叫(但保留「!(your.aspect)」!)。但再一次:請不要這樣做。如果你希望更改的hashCode是你的代碼的一部分,請改變它們,不要在Aspects中混淆它們。如果他們不是你的代碼的一部分,這應該是更不要惹他們的理由。特別是當你開始深入研究Java內部時,你的方面......這種方式只有瘋狂的謊言。 – sheltem

+0

Aaand ...如果你還沒有這樣做,你將不得不切換到加載時間編織而不是編譯時編織。 – sheltem