AspectJ:改变建议中的目标

时间:2013-08-30 04:51:19

标签: aspectj

我在周围的adivce中切入了字符串.hashCode。我想将目标(String)更改为大写,然后继续调用原始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();

}

1 个答案:

答案 0 :(得分: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();))。