2011-06-02 19 views
33

lo que sería una buena manera de cargar dinámicamente archivos de clase Java, por lo que un programa compilado en un frasco puede leer todos los archivos de clase en un directorio y usarlos, y cómo se puede escribir los archivos para que tengan el nombre del paquete necesario en relación con el tarro?Método para cargar dinámicamente clases Java archivos

Respuesta

70

Creo que es un ClassLoader que está buscando.

Le sugiero que comience por mirar el siguiente ejemplo que carga archivos de clase que no están en la ruta de clase.

// Create a File object on the root of the directory containing the class file 
File file = new File("c:\\myclasses\\"); 

try { 
    // Convert File to a URL 
    URL url = file.toURL();   // file:/c:/myclasses/ 
    URL[] urls = new URL[]{url}; 

    // Create a new class loader with the directory 
    ClassLoader cl = new URLClassLoader(urls); 

    // Load in the class; MyClass.class should be located in 
    // the directory file:/c:/myclasses/com/mycompany 
    Class cls = cl.loadClass("com.mycompany.MyClass"); 
} catch (MalformedURLException e) { 
} catch (ClassNotFoundException e) { 
} 
+4

+1 URLClassLoader es el camino a seguir! – OscarRyz

+0

Sí, creo que ClassLoader es lo que estoy buscando. Sin embargo, ¿puedes pensar en una forma de usar efectivamente la clase cargada? Podría hacerlo implementar una interfaz ... pero ¿cómo podría hacer referencia a esa interfaz? Hmm ... tal vez si tuviera que agregar el jar compilado como un jarrón externo ... en ese caso, ¿a qué debería llamar el paquete de la clase cargada? Si tengo: /thing/myjar.jar y thing/loadedclasses/class.class, ¿cuál sería el paquete declarado para esa clase? – MirroredFate

+0

Sí, tendría que aceptar una interfaz o clase abstracta que implemente/extienda la clase a cargar. (O confíe completamente en la reflexión de las clases cargadas). – aioobe

1

Si agrega un directorio a la ruta de clase, se puede añadir después de clases se inicia la aplicación y las clases se pueden cargar tan pronto como se hayan escrito en el directorio.

7
MyClass obj = (MyClass) ClassLoader.getSystemClassLoader().loadClass("test.MyClass").newInstance(); 
obj.testmethod(); 

o

MyClass obj = (MyClass) Class.forName("test.MyClass").newInstance(); 
obj.testmethod(); 
Cuestiones relacionadas