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();
}
謝謝sheltem。一個簡單的問題,有時.hashCode在Java集合中隱式調用,即HashTable,只是攔截對.hashCode的調用在這種情況下不起作用...任何推薦? – enfany
您可以嘗試刪除「within(your.package.here)」 - 切入點的一部分,因此也建議在該切入點之外的呼叫(但保留「!(your.aspect)」!)。但再一次:請不要這樣做。如果你希望更改的hashCode是你的代碼的一部分,請改變它們,不要在Aspects中混淆它們。如果他們不是你的代碼的一部分,這應該是更不要惹他們的理由。特別是當你開始深入研究Java內部時,你的方面......這種方式只有瘋狂的謊言。 – sheltem
Aaand ...如果你還沒有這樣做,你將不得不切換到加載時間編織而不是編譯時編織。 – sheltem