0

我在周围的 adivce 中切入了 String .hashCode。我想将目标(字符串)更改为大写,然后继续调用原始 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() 方法的调用重新路由到对该字符串的 .toUpperCase() 相同方法的调用。必须以这种方式完成,因为您无法更改 joinPoint 的目标(这就是为什么您的建议可能什么都不做的原因)。

向切入点添加“!within(your.package.AspectClass)”可以防止在切面内的调用中无限循环地应用相同的建议。

让我知道这是否有帮助,或者是否仍然有问题(除了您正在使用 hashCode() ;) 的事实)。

于 2013-09-02T16:29:41.110 回答