Usando Johannes Link's ClasspathSuite, yo era capaz de hacerlo de esta manera:
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();
}
El ClasspathClassesFinder busca de clases archivos y jar en classpath del sistema.
En su caso específico, usted podría modificar acceptClass así:
@Override public boolean acceptClass(Class<?> c) {
return ICommand.class.isAssignableFrom(c);
}
Una cosa a tener en cuenta: cuidado con lo que regresa en acceptClassName, como el siguiente que ClasspathClassesFinder hace es cargar la clase y llamar a acceptClass . Si acceptClassName siempre devuelve verdadero, terminará cargando cada clase en la ruta de clase y eso puede causar un OutOfMemoryError.
por favor edítalo para que sea legible. ¿Qué es un 'javapackage'?¿Qué es un "deseo de comando"? – bmargulies
El tema del tema es perfecto: http://google.com/search?q=Getting+all+Classes+from+a+Package =) – BalusC
@balusc, pero la/correcta/respuesta es difícil. –