Tengo una aplicación que permite, usando una clase abstracta, que las personas escriban sus propias implementaciones. Cargué estas implementaciones como .class-files desde un directorio. Actualmente, tengo esta solución:Cargar clases desde la carpeta sin especificar el paquete
File classDir = new File("https://stackoverflow.com/users/myproject/classes/");
URL[] url = { classDir.toURI().toURL() };
URLClassLoader urlLoader = new URLClassLoader(url);
String filename;
for (File file : classDir.listFiles()) {
filename = string.getFilenameWithoutExtension(file);
if (filename.equals(".") || filename.equals("..") || filename.startsWith("."))
continue;
AbstractClass instance = (AbstractClass)urlLoader
.loadClass("org.mypackage." + filename)
.getConstructor(ConfigUtil.class, DatabaseUtil.class, StringUtil.class)
.newInstance(config, database, string));
instance.doSomething();
}
Como se puede ver - que necesito para especificar el paquete las clases se encuentran en el fin de cargar correctamente ellos. Omitir el paquete, obtengo un
java.lang.NoClassDefFoundError:
MyClass (wrong name: org/mypackage/MyClass)
error.
Ahora, desde un POV arquitectónico, creo que está muy poco diseñado que las clases diseñadas por otras personas tengan que compilarse en MI paquete cuando se carguen.
Así que les pregunto: ¿hay alguna forma de cargar las clases del sistema de archivos sin tener que especificar el paquete en el que residen?
¿Podría mantener la estructura del paquete como una estructura de carpetas en su camino? ¿Y crea el nombre del paquete desde la ruta antes de cargar la clase? –
Eso sería una posibilidad ... Al menos entonces no tendría que preocuparme cuando dos clases tienen el mismo nombre ... ¡bien pensado desde otro ángulo! :) –
Pruébalo y ver si funciona, si quieres algunos ejemplos de código, házmelo saber! –