code: private static <A extends Annotation> A findAnnotation(final Annotation sourceAnnotation,
  														   final Class<A> targetAnnotationClass, final Set<Class<? extends Annotation>> alreadyCheckedAnnotations) {
  
  		final Class<? extends Annotation> currentAnnotationType = sourceAnnotation.annotationType();
  		alreadyCheckedAnnotations.add(currentAnnotationType);
  
  		final A result = currentAnnotationType.getAnnotation(targetAnnotationClass);
  		if (result != null)
  			return result;
  
  		final Annotation[] allAnnotations = currentAnnotationType.getAnnotations();
  		for (final Annotation annotation : allAnnotations) {
  			final Class<? extends Annotation> annotationType = annotation.annotationType();
  			if (alreadyCheckedAnnotations.contains(annotationType))
  				continue;
  			final A found = findAnnotation(annotation, targetAnnotationClass, alreadyCheckedAnnotations);
  			if (found != null)
  				return found;
  		}
  
  		return null;
  	}
docs: Recursive annotation search, with check in all assigned {@link ElementType#ANNOTATION_TYPE} - annotations.
  
  @param sourceAnnotation
  incoming / source {@link Annotation}
  @param targetAnnotationClass
  target / required annotation class
  @param alreadyCheckedAnnotations
  annotations which were already checked
  @param <A>
  type param
  @return * @return {@link A} in case if found, {@code null} otherwise