diff --git a/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java b/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java index 22941bf19..454a2ff9d 100644 --- a/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java +++ b/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java @@ -35,7 +35,7 @@ public class CoherentEventFactory { // static initialiser static { - Set> knownClasses = ReflectionUtil.loadClasses("org.asteriskjava.pbx.asterisk.wrap.events", + Set> knownClasses = ReflectionUtil.loadClasses("org.asteriskjava.pbx.asterisk.wrap.events", ManagerEvent.class); ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); diff --git a/src/main/java/org/asteriskjava/util/ReflectionUtil.java b/src/main/java/org/asteriskjava/util/ReflectionUtil.java index 0dfc844e0..83b80282c 100644 --- a/src/main/java/org/asteriskjava/util/ReflectionUtil.java +++ b/src/main/java/org/asteriskjava/util/ReflectionUtil.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.util; +import org.reflections.Reflections; + import java.io.File; import java.io.IOException; import java.lang.reflect.Constructor; @@ -30,6 +32,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Utility class that provides helper methods for reflection that is used by the @@ -257,35 +261,24 @@ public static Object newInstance(String s) { private static final Log logger = LogFactory.getLog(ReflectionUtil.class); /** - * find and all non abstract classes that implement/extend - * baseClassOrInterface in the package packageName + * Find all non-abstract classes in the given package that + * implement/extend the provided type. * - * @param packageName - * @param baseClassOrInterface - * @return + * @param packageName the package to search + * @param baseClassOrInterface the supertype or interface to filter by + * @return a Set of types that implement or extend the provided type */ - @SuppressWarnings("unchecked") - public static Set> loadClasses(String packageName, Class baseClassOrInterface) { - Set> result = new HashSet<>(); - - try { - Set classNames = getClassNamesFromPackage(packageName); - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - for (String className : classNames) { - try { - Class clazz = classLoader.loadClass(packageName + "." + className); - if (!Modifier.isAbstract(clazz.getModifiers()) && baseClassOrInterface.isAssignableFrom(clazz)) { - result.add((Class) clazz); - } - } catch (Throwable e) { - logger.error(e, e); - } - - } - logger.info("Loaded " + result.size()); - } catch (Exception e) { - logger.error(e, e); - } + public static Set> loadClasses(String packageName, Class baseClassOrInterface) { + Set> result = + Stream.concat( + Stream.of(baseClassOrInterface), + new Reflections(packageName) + .getSubTypesOf(baseClassOrInterface) + .stream()) + .filter(c -> !Modifier.isAbstract(c.getModifiers())) + .collect(Collectors.toSet()); + + logger.info("Loaded asd" + result.size()); return result; }