Do as much work as we can as part of the set-up so that argument binding on subsequent advice invocations can be as fast as possible.
If the first argument is of type JoinPoint or ProceedingJoinPoint then we pass a JoinPoint in that position (ProceedingJoinPoint for around advice).
If the first argument is of type JoinPoint.StaticPart
then we pass a JoinPoint.StaticPart
in that position.
Remaining arguments have to be bound by pointcut evaluation at a given join point. We will get back a map from argument name to value. We need to calculate which advice parameter needs to be bound to which argument name. There are multiple strategies for determining this binding, which are arranged in a ChainOfResponsibility.