code: @SuppressWarnings("unchecked")
  	public static <A extends Annotation> A findAnnotation(Method method, Class<A> annotationType) {
  		AnnotationCacheKey cacheKey = new AnnotationCacheKey(method, annotationType);
  		A result = (A) findAnnotationCache.get(cacheKey);
  		if (result == null) {
  			result = getAnnotation(method, annotationType);
  			Class<?> clazz = method.getDeclaringClass();
  			if (result == null) {
  				result = searchOnInterfaces(method, annotationType, clazz.getInterfaces());
  			}
  			while (result == null) {
  				clazz = clazz.getSuperclass();
  				if (clazz == null || clazz.equals(Object.class)) {
  					break;
  				}
  				try {
  					Method equivalentMethod = clazz.getDeclaredMethod(method.getName(), method.getParameterTypes());
  					result = getAnnotation(equivalentMethod, annotationType);
  				}
  				catch (NoSuchMethodException ex) {
  					// No equivalent method found
  				}
  				if (result == null) {
  					result = searchOnInterfaces(method, annotationType, clazz.getInterfaces());
  				}
  			}
  			if (result != null) {
  				findAnnotationCache.put(cacheKey, result);
  			}
  		}
  		return result;
  	}
docs: Find a single {@link Annotation} of {@code annotationType} from the supplied
  {@link Method}, traversing its super methods (i.e., from superclasses and
  interfaces) if no annotation can be found on the given method itself.
  <p>Annotations on methods are not inherited by default, so we need to handle
  this explicitly.
  @param method the method to look for annotations on
  @param annotationType the annotation type to look for
  @return the annotation found, or {@code null} if none