code: @SuppressWarnings("unchecked")
  	public static <A extends Annotation> A findAnnotation(Class<?> clazz, Class<A> annotationType) {
  		AnnotationCacheKey cacheKey = new AnnotationCacheKey(clazz, annotationType);
  		A result = (A) findAnnotationCache.get(cacheKey);
  		if (result == null) {
  			result = findAnnotation(clazz, annotationType, new HashSet<Annotation>());
  			if (result != null) {
  				findAnnotationCache.put(cacheKey, result);
  			}
  		}
  		return result;
  	}
docs: Find a single {@link Annotation} of {@code annotationType} on the
  supplied {@link Class}, traversing its interfaces, annotations, and
  superclasses if the annotation is not <em>present</em> on the given class
  itself.
  <p>This method explicitly handles class-level annotations which are not
  declared as {@link java.lang.annotation.Inherited inherited} <em>as well
  as meta-annotations and annotations on interfaces</em>.
  <p>The algorithm operates as follows:
  <ol>
  <li>Search for the annotation on the given class and return it if found.
  <li>Recursively search through all interfaces that the given class declares.
  <li>Recursively search through all annotations that the given class declares.
  <li>Recursively search through the superclass hierarchy of the given class.
  </ol>
  <p>Note: in this context, the term <em>recursively</em> means that the search
  process continues by returning to step #1 with the current interface,
  annotation, or superclass as the class to look for annotations on.
  @param clazz the class to look for annotations on
  @param annotationType the type of annotation to look for
  @return the annotation if found, or {@code null} if not found