in junit-platform-commons/src/main/java/org/junit/platform/commons/util/AnnotationUtils.java [118:168]
private static <A extends Annotation> Optional<A> findAnnotation(AnnotatedElement element, Class<A> annotationType,
boolean inherited, Set<Annotation> visited) {
Preconditions.notNull(annotationType, "annotationType must not be null");
if (element == null) {
return Optional.empty();
}
// Directly present?
A annotation = element.getDeclaredAnnotation(annotationType);
if (annotation != null) {
return Optional.of(annotation);
}
// Meta-present on directly present annotations?
Optional<A> directMetaAnnotation = findMetaAnnotation(annotationType, element.getDeclaredAnnotations(),
inherited, visited);
if (directMetaAnnotation.isPresent()) {
return directMetaAnnotation;
}
if (element instanceof Class) {
Class<?> clazz = (Class<?>) element;
// Search on interfaces
for (Class<?> ifc : clazz.getInterfaces()) {
if (ifc != Annotation.class) {
Optional<A> annotationOnInterface = findAnnotation(ifc, annotationType, inherited, visited);
if (annotationOnInterface.isPresent()) {
return annotationOnInterface;
}
}
}
// Indirectly present?
// Search in class hierarchy
if (inherited) {
Class<?> superclass = clazz.getSuperclass();
if (superclass != null && superclass != Object.class) {
Optional<A> annotationOnSuperclass = findAnnotation(superclass, annotationType, inherited, visited);
if (annotationOnSuperclass.isPresent()) {
return annotationOnSuperclass;
}
}
}
}
// Meta-present on indirectly present annotations?
return findMetaAnnotation(annotationType, element.getAnnotations(), inherited, visited);
}