docs: public static MethodInvoker getMethodInvokerByAnnotation(
  			final Class<? extends Annotation> annotationType, final Object target,
  			final Class<?>... expectedParamTypes) {
  		MethodInvoker mi = MethodInvokerUtils.getMethodInvokerByAnnotation(annotationType,
  				target);
  		final Class<?> targetClass = (target instanceof Advised)
  				? ((Advised) target).getTargetSource().getTargetClass()
  				: target.getClass();
  		if (mi != null) {
  			ReflectionUtils.doWithMethods(targetClass,
  					new ReflectionUtils.MethodCallback() {
  						public void doWith(Method method)
  								throws IllegalArgumentException, IllegalAccessException {
  							Annotation annotation = AnnotationUtils.findAnnotation(method,
  									annotationType);
  							if (annotation != null) {
  								Class<?>[] paramTypes = method.getParameterTypes();
  								if (paramTypes.length > 0) {
  									String errorMsg = "The method [" + method.getName()
  											+ "] on target class ["
  											+ targetClass.getSimpleName()
  											+ "] is incompatable with the signature ["
  											+ getParamTypesString(expectedParamTypes)
  											+ "] expected for the annotation ["
  											+ annotationType.getSimpleName() + "].";
  
  									Assert.isTrue(
  											paramTypes.length == expectedParamTypes.length,
  											errorMsg);
  									for (int i = 0; i < paramTypes.length; i++) {
  										Assert.isTrue(expectedParamTypes[i]
  												.isAssignableFrom(paramTypes[i]),
  												errorMsg);
  									}
  								}
  							}
  						}
  					});
  		}
  		return mi;
  	}