Используя Johannes Link's 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 ищет класс файлов и банок в системном пути.
В вашем конкретном случае, вы могли бы изменить acceptClass так:
@Override public boolean acceptClass(Class<?> c) {
return ICommand.class.isAssignableFrom(c);
}
Одно замечание: будьте осторожны, что вы возвращаетесь в acceptClassName, как следующая вещь ClasspathClassesFinder делает это загрузить класс и вызвать acceptClass , Если acceptClassName всегда возвращает true, вы в конечном итоге загружаете каждый класс в путь класса и это может вызвать OutOfMemoryError.
отредактируйте это, чтобы быть разборчивым. Что такое «javapackage».Что такое «желание команд». – bmargulies
Тема темы прекрасна: http://google.com/search?q=Getting+all+Classes+from+a+Package =) – BalusC
@balusc, но/correct/answer сложно. –