/** * */ package org.minnal.utils.scanner; import com.google.common.reflect.ClassPath; import com.google.common.reflect.ClassPath.ClassInfo; /** * @author ganeshs * */ public abstract class AbstractScanner implements Scanner<Class<?>> { private String[] packages; private ClassLoader classLoader; public AbstractScanner(String... packages) { this(Thread.currentThread().getContextClassLoader(), packages); } public AbstractScanner(ClassLoader classLoader, String... packages) { this.packages = packages; this.classLoader = classLoader; } public void scan(Listener<Class<?>> listener) { try { ClassPath path = ClassPath.from(classLoader); for (String packageName : packages) { for (ClassInfo classInfo : path.getTopLevelClassesRecursive(packageName)) { Class<?> clazz = classLoader.loadClass(classInfo.getName()); if (match(clazz)) { listener.handle(clazz); } } } } catch (Exception e) { e.printStackTrace(); // TODO Handle exception } } protected abstract boolean match(Class<?> clazz); }