private <T> List<Class<? extends T>> _findSubclasses(Class<T> clazz) { if (clazz == null) throw new NullPointerException("class cannot be null"); List<Class<? extends T>> classes = new LinkedList<Class<? extends T>>(); for (ClassInfo classInfo : classInfos.values()) { try { final String name = clazz.getName(); if (name.equals(classInfo.superType)) { if (clazz.isAssignableFrom(classInfo.get())) { final Class<? extends T> asSubclass = classInfo.get().asSubclass(clazz); classes.add(asSubclass); classes.addAll(_findSubclasses(asSubclass)); } } } catch (ClassNotFoundException e) { classesNotLoaded.add(classInfo.getName()); } } return classes; }
private <T> List<Class<? extends T>> _findSubclasses(Class<T> clazz) { if (clazz == null) throw new NullPointerException("class cannot be null"); List<Class<? extends T>> classes = new LinkedList<Class<? extends T>>(); for (ClassInfo classInfo : classInfos.values()) { try { final String name = clazz.getName(); if (name.equals(classInfo.superType)) { if (clazz.isAssignableFrom(classInfo.get())) { final Class<? extends T> asSubclass = classInfo.get().asSubclass(clazz); classes.add(asSubclass); classes.addAll(_findSubclasses(asSubclass)); } } } catch (ClassNotFoundException e) { classesNotLoaded.add(classInfo.getName()); } } return classes; }
private <T> List<Class<? extends T>> _findSubclasses(Class<T> clazz) { if (clazz == null) throw new NullPointerException("class cannot be null"); List<Class<? extends T>> classes = new ArrayList<Class<? extends T>>(); for (ClassInfo classInfo : classInfos.values()) { try { if (clazz.getName().equals(classInfo.superType)) { if (clazz.isAssignableFrom(classInfo.get())) { classes.add(classInfo.get().asSubclass(clazz)); classes.addAll(_findSubclasses(classInfo.get().asSubclass(clazz))); } } } catch (ClassNotFoundException e) { classesNotLoaded.add(classInfo.getName()); } } return classes; }
public <T> List<Class<? extends T>> findImplementations(Class<T> clazz) { if (clazz == null) throw new NullPointerException("class cannot be null"); if (!clazz.isInterface()) new IllegalArgumentException("class must be an interface"); classesNotLoaded.clear(); final String interfaceName = clazz.getName(); // Collect all interfaces extending the main interface (recursively) // Collect all implementations of interfaces // i.e. all *directly* implementing classes final List<ClassInfo> infos = collectImplementations(interfaceName); // Collect all subclasses of implementations final List<Class<? extends T>> classes = new LinkedList<Class<? extends T>>(); for (ClassInfo info : infos) { try { final Class<? extends T> impl = (Class<? extends T>) info.get(); if (!classes.contains(impl) && clazz.isAssignableFrom(impl)) { classes.add(impl); // Optimization: Don't need to call this method if parent class was already searched final List<Class<? extends T>> c = _findSubclasses((Class<T>) impl); for (final Class<? extends T> cl : c) { if (!classes.contains(cl)) { classes.add(cl); } } } } catch (final ClassNotFoundException e) { classesNotLoaded.add(info.getName()); } } return classes; }
public <T> List<Class<? extends T>> findImplementations(Class<T> clazz) { if (clazz == null) throw new NullPointerException("class cannot be null"); if (!clazz.isInterface()) new IllegalArgumentException("class must be an interface"); classesNotLoaded.clear(); final String interfaceName = clazz.getName(); // Collect all interfaces extending the main interface (recursively) // Collect all implementations of interfaces // i.e. all *directly* implementing classes final List<ClassInfo> infos = collectImplementations(interfaceName); // Collect all subclasses of implementations final List<Class<? extends T>> classes = new LinkedList<Class<? extends T>>(); for (ClassInfo info : infos) { try { final Class<? extends T> impl = (Class<? extends T>) info.get(); if (!classes.contains(impl) && clazz.isAssignableFrom(impl)) { classes.add(impl); // Optimization: Don't need to call this method if parent class was already searched final List<Class<? extends T>> c = _findSubclasses((Class<T>) impl); for (final Class<? extends T> cl : c) { if (!classes.contains(cl)) { classes.add(cl); } } } } catch (final ClassNotFoundException e) { classesNotLoaded.add(info.getName()); } } return classes; }
public <T> List<Class<? extends T>> findImplementations(Class<T> clazz) { if (clazz == null) throw new NullPointerException("class cannot be null"); if (!clazz.isInterface()) new IllegalArgumentException("class must be an interface"); classesNotLoaded.clear(); final String interfaceName = clazz.getName(); // Collect all interfaces extending the main interface (recursively) // Collect all implementations of interfaces // i.e. all *directly* implementing classes List<ClassInfo> infos = collectImplementations(interfaceName); // Collect all subclasses of implementations List<Class<? extends T>> classes = new ArrayList<Class<? extends T>>(); for (ClassInfo info : infos) { try { final Class<? extends T> impl = (Class<? extends T>) info.get(); if (clazz.isAssignableFrom(impl)) { classes.add(impl); // Optimization: Don't need to call this method if parent class was already searched classes.addAll(_findSubclasses(impl)); } } catch (ClassNotFoundException e) { classesNotLoaded.add(info.getName()); } } return classes; }