2012-02-08 14 views
5

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?

+1

¿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? –

+0

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! :) –

+0

Pruébalo y ver si funciona, si quieres algunos ejemplos de código, házmelo saber! –

Respuesta

3

Sí; implementar una interfaz (o usar una anotación).

Luego use cualquier biblioteca de escaneo de clases (hay muchas preguntas SO sobre esto, como this one) para cargar la clase particular en cuestión. Buscar "Escaneo de clase Java" o "Mecanismo de complemento de Java" ayudará.

También puede utilizar el Java Plugin Framework y evitar un poco de esfuerzo. Aunque no está claro para mí que se mantenga más, sé que la gente todavía lo está usando.

+0

No creo que una interfaz funcione correctamente (semánticamente hablando) en mi caso. El 'AbstractClass' tiene muchas funciones predefinidas que solo usan los métodos anulados (pasivo de anulación, wtf?) De la implementación. Una interfaz no lo permite. –

+0

@FlorianPeschka ... misma diferencia. –

+0

No entiendo tu comentario. ¿Qué diferencia de qué? –

Cuestiones relacionadas