我正在尝试使用AspectJ规范化应用程序中的URI.我正在捕获使用此代码传递给java.net.URI参数的方法的每个调用:
Object around() : execution(* *(..,java.net.URI,..)) {
for ( Object arg : thisJoinPoint.getArgs() ) {
if ( arg instanceof URI ) {
// normalize
}
}
return proceed();
}
Run Code Online (Sandbox Code Playgroud)
但是,由于URI是不可变的,我无法将规范化值交换到现有对象中.我需要的是调用继续使用新的,规范化的URI对象(并且可能传递其他参数不变).但是,继续调用只允许我传递由连接点收集的参数.有没有办法为可变数量的参数实现这一点(主要是对任何URI参数感兴趣,但愿意收集并传递所有参数)?
您需要更改建议的签名:
Object around(Object[] args) : execution(* *(..,java.net.URI,..)) && args(args) {
for(int i = 0; i < args.length; i++){
Object arg = args[i];
if ( arg instanceof URI ) {
args[i] = normalizeUrI((URI)arg);
}
}
return proceed(args);
}
Run Code Online (Sandbox Code Playgroud)
更新:不幸的是,上面的代码不起作用。但这应该:
Object around() throws URISyntaxException : execution(* **.*(..,URI,..)) {
final Object[] args = thisJoinPoint.getArgs();
for(int i = 0; i < args.length; i++){
final Object arg = args[i];
if ( arg instanceof URI ) {
args[i] = normalizeUrI((URI)arg);
}
}
try{
return ((ProceedingJoinPoint)thisJoinPoint).proceed(args);
} catch(final Throwable e){
throw new IllegalStateException(e);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7176 次 |
| 最近记录: |