src/main/java/js/container/ManagedClass.java
private static <T extends Annotation> T getAnnotation(Method method, Class<T> annotationClass) {
		T annotation = method.getAnnotation(annotationClass);
		if (annotation == null) {
			for (Class<?> interfaceClass : method.getDeclaringClass().getInterfaces()) {
				try {
					annotation = interfaceClass.getMethod(method.getName(), method.getParameterTypes()).getAnnotation(annotationClass);
					if (annotation != null) {
						return annotation;
					}
				} catch (NoSuchMethodException unused) {
				}
			}
		}
		return annotation;
	}
private static <T extends Annotation> T getAnnotation(Method method, Class<T> annotationClass) {
		T annotation = method.getAnnotation(annotationClass);
		if (annotation == null) {
			for (Class<?> interfaceClass : method.getDeclaringClass().getInterfaces()) {
				try {
					annotation = interfaceClass.getMethod(method.getName(), method.getParameterTypes()).getAnnotation(annotationClass);
					if (annotation != null) {
						return annotation;
					}
				} catch (NoSuchMethodException unused) {
				}
			}
		}
		return annotation;
	}
Get method annotation or null if none found. This getter uses extended annotation searching scope: it searches first on
given method declaring class then tries with all class interfaces. Note that only interfaces are used as alternative for
method annotation search. Super class is not included.
<p>
Returns null if no method annotation found on base class or interfaces.

@param method method to search for annotation,
@param annotationClass annotation to search for.
@param <T> annotation type.
@return annotation instance or null if none found.