Adds advice to the method. Adding advice implicitly rewrites the implementation of the method (this occurs inside at the end of the class transformation). When the method is invoked, control will flow through the MethodAdvice
in the order they are added. Each piece of advice will receive the {@link MethodInvocation} and should invoke {@link MethodInvocation#proceed()} to pass control to the next pieceof advice (and ultimately, to the actual method invocation).
If a method implementation is changed, using {@link #changeImplementation(InstructionBuilderCallback)}, that change will be honored, but the logic will only be invoked at the end of the chain of MethodAdvice. Internally, a new method is created with the same parameters, exceptions, return type and implementation (bytecode) as the advised method,
then the advised method's implementation is changed.
Note additionally that a recursive method invocation will still invoke the MethodAdvice chain on each recursive call (this is an intended side-effect of copying the exact bytecode of the method implementation.
@param advice advice to add to the method
@return this method, for further configuration