private int getOrder(@NotNull Object o) { Queue<Class<?>> toCheck = new ArrayDeque<Class<?>>(); toCheck.add(o.getClass()); while (!toCheck.isEmpty()) { Class<?> clazz = toCheck.poll(); Order annotation = clazz.getAnnotation(Order.class); if (annotation != null) { return annotation.value(); } Class<?> c = clazz.getSuperclass(); if (c != null) { toCheck.add(c); } Class<?>[] interfaces = clazz.getInterfaces(); Collections.addAll(toCheck, interfaces); } return ExternalSystemConstants.UNORDERED; }