0

私は文字列 .hashCode をアラウンド adivce でポイントカットしました。ターゲット (文字列) を大文字に変更してから、元の hashCode の呼び出しに進みたいと思います。その方法がわかりません。次のコードは正しく機能しません。

@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();

}
4

1 に答える 1

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 のターゲットを変更できないため、この方法で行う必要があります (これが、アドバイスがそのまま何もしない理由です)。

ポイントカットに「!within(your.package.AspectClass)」を追加すると、同じアドバイスがアスペクト内の呼び出しで無限ループに適用されるのを防ぎます。

これが役立つかどうか、またはまだ何か問題がある場合はお知らせください( hashCode() ;) をいじっているという事実は別として)。

于 2013-09-02T16:29:41.110 に答える