Используя ClasspathSuite Йоханнеса Линка , я смог сделать это так:
import org.junit.extensions.cpsuite.ClassTester;
import org.junit.extensions.cpsuite.ClasspathClassesFinder;
public static List<Class<?>> getClasses(final Package pkg, final boolean includeChildPackages) {
return new ClasspathClassesFinder(new ClassTester() {
@Override public boolean searchInJars() { return true; }
@Override public boolean acceptInnerClass() { return false; }
@Override public boolean acceptClassName(String name) {
return name.startsWith(pkg.getName()) && (includeChildPackages || name.indexOf(".", pkg.getName().length()) != -1);
}
@Override public boolean acceptClass(Class<?> c) { return true; }
}, System.getProperty("java.class.path")).find();
}
ClasspathClassesFinder ищет файлы классов и файлы jar в системном classpath.
В вашем конкретном случае вы можете изменить acceptClass следующим образом:
@Override public boolean acceptClass(Class<?> c) {
return ICommand.class.isAssignableFrom(c);
}
Одна вещь, на которую следует обратить внимание: будьте осторожны с тем, что вы возвращаете в acceptClassName, так как следующая вещь, которую ClasspathClassesFinder делает, это загружает класс и вызывает acceptClass. Если acceptClassName всегда возвращает true, вы закончите загрузкой каждого класса в classpath, и это может вызвать OutOfMemoryError.