继续使用AspectJ的变量参数

Ada*_*dam 9 java aspectj

我正在尝试使用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参数感兴趣,但愿意收集并传递所有参数)?

Sea*_*oyd 3

您需要更改建议的签名:

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)