我有很多类重写equals用于对象比较。对于每个equals实现,它使用区分大小写的String .equals。我想知道是否可以使用AspectJ在每种方法中简单地用.equalsIgnoreCase替换.equals?
或者,如果上述情况不可能,我们可以使用AspectJ来拦截类以使用我自己的String .equals实现吗? (不改变方法的实施)
答案 0 :(得分:1)
你希望String.equals(Object anObject)方法在包中每次出现时重新路由到equalsIgnoreCase(String),对吗?
它的切入点需要在你的包(call(boolean equals(Object))
)中拦截对equals(within(your.packages.*)
)的调用,并提供目标(target(sourceString)
)和参数({{1}) }),所以看起来应该是这样的:
args(compareString)
使用该Pointcut的建议必须是一个周围的建议,它会跳过对equals的调用,而是自己调用equalsIgnoreCase:
@Pointcut("call(boolean equals(Object)) && args(compareString) && target(sourceString) && within(your.packages.*)")
protected void equalsPointcut(final Object compareString, final String sourceString) {}
sysout仅用于检查方面是否实际使用,当然应该在实际用例中删除。
我的测试看起来像这样:
@Around("equalsPointcut(compareString, sourceString)")
public Object around(final ProceedingJoinPoint joinPoint, final Object compareString, final String sourceString)
throws Throwable {
System.out.println("Aspect!");
return sourceString.equalsIgnoreCase(compareString != null ? compareString.toString() : null);
}
它产生输出:
public static void main(final String[] args) {
String a = "Blaaaa";
String b = "BLAAAA";
System.out.println(a.equals(b));
Object c = new Object();
System.out.println(c.equals(b));
}
注意a.equals(b)被重新路由到equalsIgnoreCase(因为它的目标是一个String),但c.equals(b)不是(因为它的目标是一个Object!)
我希望这能回答你的问题。快乐的编码! ;)