/** * Returns the list of {@link ModelUpdate} types in this binding context. * @param modelClass * @return the of {@link Class}es that implement {@link ModelUpdate} in this binding context. */ public static List<Class<?>> findModelUpdateClass(final BindableModel modelClass) { List<Class<?>> classes = Reflections.getTypesOfTypeForClassHierarchy( modelClass.getClass(), ModelUpdate.class); Predicate<Class<?>> isEnum = new Predicate<Class<?>>() { public boolean apply(final Class<?> input) { return input.isEnum(); } }; // Look for ModelUpdate classes in implemented interfaces classes = Lists.newArrayList(Iterables.filter(classes, isEnum)); for (Class<?> iface : modelClass.getClass().getInterfaces()) { classes.addAll(Lists.newArrayList(Iterables.filter( Reflections.getTypesOfTypeForClassHierarchy( iface, ModelUpdate.class), isEnum))); } if (classes.size() == 0) { return null; } return classes; }