У меня есть два аспекта, каждый из которых модифицирует аргументы метода. Когда оба аспекта применяются к одному и тому же методу, я ожидаю, что выполнение аспектов будет привязано, и я ожидаю, что аргументы, модифицированные в первом аспекте, будут доступны во втором аспекте через joinPoint.getArgs();
Однако, похоже, что каждый аспект получает только исходные аргументы; второй аспект никогда не видит измененных значений. Я придумал пример:
Класс тестирования:
public class AspectTest extends TestCase {
@Moo
private void foo(String boo, String foo) {
System.out.println(boo + foo);
}
public void testAspect() {
foo("You should", " never see this");
}
}
Метод foo() рекомендуется двумя аспектами:
@Aspect
public class MooImpl {
@Pointcut("execution(@Moo * *(..))")
public void methodPointcut() {}
@Around("methodPointcut()")
public Object afterMethodInControllerClass(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("MooImpl is being called");
Object[] args = joinPoint.getArgs();
args[0] = "don't";
return joinPoint.proceed(args);
}
}
и...
@Aspect
public class DoubleMooImpl {
@Pointcut("execution(@Moo * *(..))")
public void methodPointcut() {}
@Around("methodPointcut()")
public Object afterMethodInControllerClass(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("DoubleMooImpl is being called");
Object[] args = joinPoint.getArgs();
args[1] = " run and hide";
return joinPoint.proceed(args);
}
}
Я ожидаю, что выход будет следующим:
MooImpl is being called
DoubleMooImpl is being called
don't run and hide
... но есть:
MooImpl is being called
DoubleMooImpl is being called
You should run and hide
Я использую правильный подход для изменения аргументов через советы?